MCPcopy
hub / github.com/u2takey/ffmpeg-go

github.com/u2takey/ffmpeg-go @v0.5.0 sqlite

repository ↗ · DeepWiki ↗ · release v0.5.0 ↗
203 symbols 889 edges 24 files 23 documented · 11%
README

ffmpeg-go

ffmpeg-go is golang port of https://github.com/kkroening/ffmpeg-python

check examples/example_test.go and ffmpeg_test.go for more examples.

Examples

split := Input(TestInputFile1).VFlip().Split()
    split0, split1 := split.Get("0"), split.Get("1")
    overlayFile := Input(TestOverlayFile).Crop(10, 10, 158, 112)
err := Concat([]*Stream{
    split0.Trim(KwArgs{"start_frame": 10, "end_frame": 20}),
    split1.Trim(KwArgs{"start_frame": 30, "end_frame": 40})}).
    Overlay(overlayFile.HFlip(), "").
    DrawBox(50, 50, 120, 120, "red", 5).
    Output(TestOutputFile1).
    OverWriteOutput().
    Run()

Transcoding From One Codec To Another

err := ffmpeg.Input("./sample_data/in1.mp4").
        Output("./sample_data/out1.mp4", ffmpeg.KwArgs{"c:v": "libx265"}).
        OverWriteOutput().ErrorToStdOut().Run()

Cut Video From Timestamp

err := ffmpeg.Input("./sample_data/in1.mp4", ffmpeg.KwArgs{"ss": 1}).
    Output("./sample_data/out1.mp4", ffmpeg.KwArgs{"t": 1}).OverWriteOutput().Run()
assert.Nil(t, err)

Add Watermark For Video

// show watermark with size 64:-1 in the top left corner after seconds 1
overlay := ffmpeg.Input("./sample_data/overlay.png").Filter("scale", ffmpeg.Args{"64:-1"})
err := ffmpeg.Filter(
    []*ffmpeg.Stream{
        ffmpeg.Input("./sample_data/in1.mp4"),
        overlay,
    }, "overlay", ffmpeg.Args{"10:10"}, ffmpeg.KwArgs{"enable": "gte(t,1)"}).
    Output("./sample_data/out1.mp4").OverWriteOutput().ErrorToStdOut().Run()

result:

img.png

Cut Video For Gif

err := ffmpeg.Input("./sample_data/in1.mp4", ffmpeg.KwArgs{"ss": "1"}).
    Output("./sample_data/out1.gif", ffmpeg.KwArgs{"s": "320x240", "pix_fmt": "rgb24", "t": "3", "r": "3"}).
    OverWriteOutput().ErrorToStdOut().Run()

result:

img.png

Task Frame From Video

func ExampleReadFrameAsJpeg(inFileName string, frameNum int) io.Reader {
    buf := bytes.NewBuffer(nil)
    err := ffmpeg.Input(inFileName).
        Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
        Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}).
        WithOutput(buf, os.Stdout).
        Run()
    if err != nil {
        panic(err)
    }
    return buf
}

reader := ExampleReadFrameAsJpeg("./sample_data/in1.mp4", 5)
img, err := imaging.Decode(reader)
if err != nil {
    t.Fatal(err)
}
err = imaging.Save(img, "./sample_data/out1.jpeg")
if err != nil {
    t.Fatal(err)
}

result :

image

Get Multiple Output

// get multiple output with different size/bitrate
input := ffmpeg.Input("./sample_data/in1.mp4").Split()
out1 := input.Get("0").Filter("scale", ffmpeg.Args{"1920:-1"}).
Output("./sample_data/1920.mp4", ffmpeg.KwArgs{"b:v": "5000k"})
out2 := input.Get("1").Filter("scale", ffmpeg.Args{"1280:-1"}).
Output("./sample_data/1280.mp4", ffmpeg.KwArgs{"b:v": "2800k"})

err := ffmpeg.MergeOutputs(out1, out2).OverWriteOutput().ErrorToStdOut().Run()

Show FFmpeg Progress

see complete example at: showProgress

func ExampleShowProgress(inFileName, outFileName string) {
    a, err := ffmpeg.Probe(inFileName)
    if err != nil {
        panic(err)
    }
    totalDuration := gjson.Get(a, "format.duration").Float()

    err = ffmpeg.Input(inFileName).
        Output(outFileName, ffmpeg.KwArgs{"c:v": "libx264", "preset": "veryslow"}).
        GlobalArgs("-progress", "unix://"+TempSock(totalDuration)).
        OverWriteOutput().
        Run()
    if err != nil {
        panic(err)
    }
}
ExampleShowProgress("./sample_data/in1.mp4", "./sample_data/out2.mp4")

result

progress:  .0
progress:  0.72
progress:  1.00
progress:  done

Integrate FFmpeg-go With Open-CV (gocv) For Face-detect

see complete example at: opencv

result: image

Set Cpu limit/request For FFmpeg-go

e := ComplexFilterExample("./sample_data/in1.mp4", "./sample_data/overlay.png", "./sample_data/out2.mp4")
err := e.RunWithResource(0.1, 0.5)
if err != nil {
    assert.Nil(t, err)
}

result from command top: we will see ffmpeg used 0.5 core as expected.

> top 
PID    USER       PR  NI    VIRT    RES    SHR S  %CPU   %MEM     TIME+ COMMAND
1386105 root      20   0 2114152 273780  31672 R  50.2   1.7      0:16.79 ffmpeg

View Progress Graph

function view generate mermaid chart, which can be use in markdown or view online

split := Input(TestInputFile1).VFlip().Split()
    split0, split1 := split.Get("0"), split.Get("1")
    overlayFile := Input(TestOverlayFile).Crop(10, 10, 158, 112)
b, err := Concat([]*Stream{
    split0.Trim(KwArgs{"start_frame": 10, "end_frame": 20}),
    split1.Trim(KwArgs{"start_frame": 30, "end_frame": 40})}).
    Overlay(overlayFile.HFlip(), "").
    DrawBox(50, 50, 120, 120, "red", 5).
    Output(TestOutputFile1).
    OverWriteOutput().View(ViewTypeFlowChart)
fmt.Println(b)

image

Extension points exported contracts — how you extend this code

DagNode (Interface)
Node in a directed-acyclic graph (DAG). Edges: DagNodes are connected by edges. An edge connects two nodes with a labe [1 …
dag.go
CommandOption (FuncType)
(no doc)
run.go
CompilationOption (FuncType)
(no doc)
run.go

Core symbols most depended-on inside this repo

Hash
called by 37
dag.go
Input
called by 36
ffmpeg.go
Output
called by 34
ffmpeg.go
Equal
called by 25
dag.go
MergeKwArgs
called by 22
utils.go
Stream
called by 20
node.go
Run
called by 18
run.go
GetArgs
called by 17
run.go

Shape

Function 110
Method 71
Struct 14
TypeAlias 5
FuncType 2
Interface 1

Languages

Go100%

Modules by API surface

node.go31 symbols
ffmpeg_test.go26 symbols
run.go23 symbols
filters.go19 symbols
utils.go17 symbols
dag.go13 symbols
run_linux.go10 symbols
examples/example_test.go10 symbols
ffmpeg.go8 symbols
examples/stream.go7 symbols
examples/showProgress.go5 symbols
examples/opencv_test.go5 symbols

Used by 2 indexed graphs manifest dependencies, hub-wide

Dependencies from manifests, versioned

github.com/aws/aws-sdk-gov1.38.20 · 1×
github.com/disintegration/imagingv1.6.2 · 1×
github.com/u2takey/go-utilsv0.3.1 · 1×
gocv.io/x/gocvv0.25.0 · 1×

For agents

$ claude mcp add ffmpeg-go \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact