ffmpeg_cli_go

package module
v0.0.0-...-fa33d34 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 27, 2026 License: Apache-2.0 Imports: 11 Imported by: 0

README

ffmpeg-cli-go

ffmpeg-cli-go is based on https://github.com/u2takey/ffmpeg-go. It has been significantly modified and refactored.

Key Differences from ffmpeg-go

This project is a streamlined fork of u2takey/ffmpeg-go, focused strictly on forming CLI commands.

  • Logic Only: All execution wrappers and process management have been removed.
  • CLI-First: The library now serves only as a tool for generating ffmpeg command-line arguments.
  • Lightweight: Stripped of high-level streaming helpers and unnecessary third-party dependencies to keep the codebase minimal.
  • Manual Execution: Users are responsible for running the generated command (e.g., via os/exec).

How to get and use

You can get this package via:

go get -u github.com/stain4/ffmpeg-cli-go

Examples

in1 := ffmpeg_cli_go.Input("clip1.mp4")
in2 := ffmpeg_cli_go.Input("clip2.mp4")
out := ffmpeg_cli_go.Output([]*ffmpeg_cli_go.Stream{
	in1.Get("v:0").Crop(0, 0, 1280, 720),
	in2.Get("a:0"),
	ffmpeg_cli_go.RawArgs("-c:v:0", "libx264", "-preset", "fast"),
	in1.MapChapters(),
	in1.MapMetadata("", "v:0"),
	in2.MapMetadata("s:v:0", "s:v:0"),
	in1.MapMetadata("s:a:0", "s:a:0"),
}, "outfile.mp4", ffmpeg_cli_go.KwArgs{"c:a": "aac", "b:a": "128K"})
fmt.Printf("%s\n", strings.Join(out.GetArgs(), " "))

result:

-i clip1.mp4 -i clip2.mp4 -filter_complex [0:v:0]crop=1280:720:0:0[s0] -map_chapters 0 -map [s0] -map 1:a:0 -map_metadata 0:v:0 -map_metadata:s:v:0 1:s:v:0 -map_metadata:s:a:0 0:s:a:0 -c:v:0 libx264 -preset fast -b:a 128K -c:a aac outfile.mp4

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AssertType

func AssertType(hasType, expectType string, action string)

func ConvertKwargsToCmdLineArgs

func ConvertKwargsToCmdLineArgs(kwargs KwArgs) []string

func DebugNodes

func DebugNodes(node []DagNode)

func DebugOutGoingMap

func DebugOutGoingMap(node []DagNode, m map[int]map[Label][]NodeInfo)

func GetDefault

func GetDefault[T any](a KwArgs, k string, defaultV T) T

Use this as shortest as: vsc := args.GetDefault("v", 1).(int) vsc := GetDefault(args, "v", 1)

func PopDefault

func PopDefault[T any](a KwArgs, k string, defaultV T) T

Use this as shortest as: awsConfig := args.PopDefault("aws_config", &aws.Config{}).(*aws.Config{}) awsConfig := PopDefault(args, "aws_config", &aws.Config{})

Types

type Args

type Args []string

func (Args) EscapeWith

func (a Args) EscapeWith(chars string) Args

func (Args) Sorted

func (a Args) Sorted() Args

type DagEdge

type DagEdge struct {
	DownStreamNode   DagNode
	DownStreamLabel  Label
	UpStreamNode     DagNode
	UpStreamLabel    Label
	UpStreamSelector Selector
}

func GetInComingEdges

func GetInComingEdges(downStreamNode DagNode, inComingEdgeMap map[Label]NodeInfo) []DagEdge

func GetOutGoingEdges

func GetOutGoingEdges(upStreamNode DagNode, outOutingEdgeMap map[Label][]NodeInfo) []DagEdge

type DagNode

type DagNode interface {
	Hash() int
	// Compare two nodes
	Equal(other DagNode) bool
	// Return a full string representation of the node.
	String() string
	// Return a partial/concise representation of the node
	ShortRepr() string
	// Provides information about all incoming edges that connect to this node.
	//
	//        The edge map is a dictionary that maps an “incoming_label“ to “(outgoing_node, outgoing_label)“.  Note that
	//        implicity, “incoming_node“ is “self“.  See "Edges" section above.
	IncomingEdgeMap() map[Label]NodeInfo
}

Node in a directed-acyclic graph (DAG).

Edges: DagNodes are connected by edges. An edge connects two nodes with a label for each side: - “upstream_node“: upstream/parent node - “upstream_label“: label on the outgoing side of the upstream node - “downstream_node“: downstream/child node - “downstream_label“: label on the incoming side of the downstream node

For example, DagNode A may be connected to DagNode B with an edge labelled "foo" on A's side, and "bar" on B's side:

_____ _____ | | | | | A >[foo]---[bar]> B | |_____| |_____|

Edge labels may be integers or strings, and nodes cannot have more than one incoming edge with the same label.

DagNodes may have any number of incoming edges and any number of outgoing edges. DagNodes keep track only of their incoming edges, but the entire graph structure can be inferred by looking at the furthest downstream nodes and working backwards.

Hashing: DagNodes must be hashable, and two nodes are considered to be equivalent if they have the same hash value.

Nodes are immutable, and the hash should remain constant as a result. If a node with new contents is required, create a new node and throw the old one away.

String representation: In order for graph visualization tools to show useful information, nodes must be representable as strings. The “String“ operator should provide a more or less "full" representation of the node, and the “ShortRepr“ property should be a shortened, concise representation.

Again, because nodes are immutable, the string representations should remain constant.

func TopSort

func TopSort(downStreamNodes []DagNode) (sortedNodes []DagNode, outOutingEdgeMaps map[int]map[Label][]NodeInfo, err error)

type Graph

type Graph struct {
	OutputStream string       `json:"output_stream"`
	GraphOptions GraphOptions `json:"graph_options"`
	Nodes        []GraphNode  `json:"nodes"`
}

type GraphNode

type GraphNode struct {
	Name          string   `json:"name"`
	InputStreams  []string `json:"input_streams"`
	OutputStreams []string `json:"output_streams"`
	Args          Args     `json:"args"`
	KwArgs        KwArgs   `json:"kw_args"`
}

type GraphOptions

type GraphOptions struct {
	Timeout         time.Duration
	OverWriteOutput bool
}

type KwArgs

type KwArgs map[string]any

func MergeKwArgs

func MergeKwArgs(args []KwArgs) KwArgs

func (KwArgs) Copy

func (a KwArgs) Copy() KwArgs

func (KwArgs) EscapeWith

func (a KwArgs) EscapeWith(chars string) KwArgs

func (KwArgs) GetString

func (a KwArgs) GetString(k string) string

func (KwArgs) HasKey

func (a KwArgs) HasKey(k string) bool

func (KwArgs) PopString

func (a KwArgs) PopString(k string) string

func (KwArgs) SortedKeys

func (a KwArgs) SortedKeys() []string

type Label

type Label string

type LightStringSet

type LightStringSet map[string]struct{}

func NewLightStringSet

func NewLightStringSet(items ...string) LightStringSet

func (LightStringSet) Delete

func (s LightStringSet) Delete(item string) LightStringSet

func (LightStringSet) Has

func (s LightStringSet) Has(item string) bool

func (LightStringSet) Insert

func (s LightStringSet) Insert(item string) LightStringSet

func (LightStringSet) List

func (s LightStringSet) List() []string

type Node

type Node struct {
	// contains filtered or unexported fields
}

func FilterMultiOutput

func FilterMultiOutput(streamSpec []*Stream, filterName string, args Args, kwArgs ...KwArgs) *Node

func NewFilterNode

func NewFilterNode(name string, streamSpec []*Stream, maxInput int, args []string, kwargs KwArgs) *Node

func NewGlobalNode

func NewGlobalNode(name string, streamSpec []*Stream, args []string, kwargs KwArgs) *Node

func NewInputNode

func NewInputNode(name string, args []string, kwargs KwArgs) *Node

func NewMapChaptersNode

func NewMapChaptersNode(name string, streamSpec []*Stream) *Node

func NewMapMetadataNode

func NewMapMetadataNode(name string, streamSpec []*Stream, kwargs KwArgs) *Node

func NewMergeOutputsNode

func NewMergeOutputsNode(name string, streamSpec []*Stream) *Node

func NewNode

func NewNode(streamSpec []*Stream,
	name string,
	incomingStreamTypes LightStringSet,
	outgoingStreamType string,
	minInputs int,
	maxInputs int,
	args []string,
	kwargs KwArgs,
	nodeType string) *Node

func NewOutputNode

func NewOutputNode(name string, streamSpec []*Stream, args []string, kwargs KwArgs) *Node

func NewRawArgsNode

func NewRawArgsNode(name string, args []string, streamSpec []*Stream) *Node

func (*Node) Equal

func (n *Node) Equal(other DagNode) bool

func (*Node) Get

func (n *Node) Get(a string) *Stream

.Get("a:m:language:rus")

func (*Node) GetFilter

func (n *Node) GetFilter(outgoingEdges []DagEdge) string

func (*Node) GetInComingEdges

func (n *Node) GetInComingEdges() []DagEdge

func (*Node) Hash

func (n *Node) Hash() int

func (*Node) IncomingEdgeMap

func (n *Node) IncomingEdgeMap() map[Label]NodeInfo

func (*Node) ShortRepr

func (n *Node) ShortRepr() string

func (*Node) Stream

func (n *Node) Stream(label Label, selector Selector) *Stream

func (*Node) String

func (n *Node) String() string

type NodeInfo

type NodeInfo struct {
	Node     DagNode
	Label    Label
	Selector Selector
}

type Selector

type Selector string

type Stream

type Stream struct {
	Node     *Node
	Label    Label
	Selector Selector
	Type     string
}

func Concat

func Concat(streams []*Stream, kwargs ...KwArgs) *Stream

func Filter

func Filter(streamSpec []*Stream, filterName string, args Args, kwArgs ...KwArgs) *Stream

func Input

func Input(filename string, kwargs ...KwArgs) *Stream

Input file URL (ffmpeg “-i“ option)

Any supplied kwargs are passed to ffmpeg verbatim (e.g. “t=20“, “f='mp4'“, “acodec='pcm'“, etc.).

To tell ffmpeg to read from stdin, use “pipe:“ as the filename.

Official documentation: `Main options <https://ffmpeg.org/ffmpeg.html#Main-options>`__

func MergeOutputs

func MergeOutputs(streams ...*Stream) *Stream

Include all given outputs in one ffmpeg command line

func NewStream

func NewStream(node *Node, streamType string, label Label, selector Selector) *Stream

func Output

func Output(streams []*Stream, fileName string, kwargs ...KwArgs) *Stream

Output file URL

Syntax:
    `ffmpeg.Output([]*Stream{stream1, stream2, stream3...}, filename, kwargs)`

Any supplied keyword arguments are passed to ffmpeg verbatim (e.g.
``t=20``, ``f='mp4'``, ``acodec='pcm'``, ``vcodec='rawvideo'``,
etc.).  Some keyword-arguments are handled specially, as shown below.

Args:
    video_bitrate: parameter for ``-b:v``, e.g. ``video_bitrate=1000``.
    audio_bitrate: parameter for ``-b:a``, e.g. ``audio_bitrate=200``.
    format: alias for ``-f`` parameter, e.g. ``format='mp4'``
        (equivalent to ``f='mp4'``).

If multiple streams are provided, they are mapped to the same
output.

To tell ffmpeg to write to stdout, use ``pipe:`` as the filename.

Official documentation: `Synopsis <https://ffmpeg.org/ffmpeg.html#Synopsis>`__
"""

func RawArgs

func RawArgs(args ...string) *Stream

RawArgs creates an initial stream of raw command-line arguments.

func (*Stream) ASplit

func (s *Stream) ASplit() *Node

func (*Stream) Audio

func (s *Stream) Audio() *Stream

func (*Stream) ColorChannelMixer

func (s *Stream) ColorChannelMixer(kwargs ...KwArgs) *Stream

todo fix this

func (*Stream) Concat

func (s *Stream) Concat(streams []*Stream, kwargs ...KwArgs) *Stream

func (*Stream) Crop

func (s *Stream) Crop(x, y, w, h int, kwargs ...KwArgs) *Stream

func (*Stream) DrawBox

func (s *Stream) DrawBox(x, y, w, h int, color string, thickness int, kwargs ...KwArgs) *Stream

func (*Stream) Drawtext

func (s *Stream) Drawtext(text string, x, y int, escape bool, kwargs ...KwArgs) *Stream

func (*Stream) Equal

func (s *Stream) Equal(other Stream) bool

func (*Stream) Filter

func (s *Stream) Filter(filterName string, args Args, kwArgs ...KwArgs) *Stream

func (*Stream) Get

func (s *Stream) Get(index string) *Stream

func (*Stream) GetArgs

func (s *Stream) GetArgs() []string

func (*Stream) GlobalArgs

func (s *Stream) GlobalArgs(args ...string) *Stream

Add extra global command-line argument(s), e.g. “-progress“.

func (*Stream) HFlip

func (s *Stream) HFlip(kwargs ...KwArgs) *Stream

func (*Stream) Hash

func (s *Stream) Hash() int

func (*Stream) Hue

func (s *Stream) Hue(kwargs ...KwArgs) *Stream

func (*Stream) MapChapters

func (s *Stream) MapChapters() *Stream

Method that initiates the creation of a MapChapters node from an InputNode node.

func (*Stream) MapMetadata

func (s *Stream) MapMetadata(ot, it string) *Stream

it - from (Input Target), ot - to (Output Target)

func (*Stream) Output

func (s *Stream) Output(fileName string, kwargs ...KwArgs) *Stream

Output file URL

Syntax:
    `ffmpeg.Output(ctx, []*Stream{stream1, stream2, stream3...}, filename, kwargs)`

Any supplied keyword arguments are passed to ffmpeg verbatim (e.g.
``t=20``, ``f='mp4'``, ``acodec='pcm'``, ``vcodec='rawvideo'``,
etc.).  Some keyword-arguments are handled specially, as shown below.

Args:
    video_bitrate: parameter for ``-b:v``, e.g. ``video_bitrate=1000``.
    audio_bitrate: parameter for ``-b:a``, e.g. ``audio_bitrate=200``.
    format: alias for ``-f`` parameter, e.g. ``format='mp4'``
        (equivalent to ``f='mp4'``).

If multiple streams are provided, they are mapped to the same
output.

To tell ffmpeg to write to stdout, use ``pipe:`` as the filename.

Official documentation: `Synopsis <https://ffmpeg.org/ffmpeg.html#Synopsis>`__
"""

func (*Stream) Overlay

func (s *Stream) Overlay(overlayParentNode *Stream, eofAction string, kwargs ...KwArgs) *Stream

func (*Stream) OverwriteOutput

func (s *Stream) OverwriteOutput(stream *Stream) *Stream

Overwrite output files without asking (ffmpeg “-y“ option)

Official documentation: `Main options <https://ffmpeg.org/ffmpeg.html#Main-options>`_

func (*Stream) RawArgs

func (s *Stream) RawArgs(args ...string) *Stream

The RawArgs method adds new arguments to an existing RawArgsStream chain.ы

func (*Stream) SetPts

func (s *Stream) SetPts(expr string) *Node

func (*Stream) Split

func (s *Stream) Split() *Node

func (*Stream) String

func (s *Stream) String() string

func (*Stream) Trim

func (s *Stream) Trim(kwargs ...KwArgs) *Stream

func (*Stream) VFlip

func (s *Stream) VFlip(kwargs ...KwArgs) *Stream

func (*Stream) Video

func (s *Stream) Video() *Stream

func (*Stream) View

func (s *Stream) View(viewType ViewType) (string, error)

func (*Stream) ZoomPan

func (s *Stream) ZoomPan(kwargs ...KwArgs) *Stream

type ViewType

type ViewType string
const (
	// FlowChart the diagram type for output in flowchart style (https://mermaid-js.github.io/mermaid/#/flowchart) (including current state
	ViewTypeFlowChart ViewType = "flowChart"
	// StateDiagram the diagram type for output in stateDiagram style (https://mermaid-js.github.io/mermaid/#/stateDiagram)
	ViewTypeStateDiagram ViewType = "stateDiagram"
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL