Categorygithub.com/csnewman/ffmpeg-go
repositorypackage
0.6.0
Repository: https://github.com/csnewman/ffmpeg-go.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

ffmpeg-go

Go bindings for the FFmpeg AV libraries.

Features

  • Static build (does still require some system libraries, such as m).
  • Linux (arm64, amd64) and macOS (arm64, amd64) support.
  • Auto generated.
  • Thin layer over the C API.
  • Doc comments retained (where supported by clang).
  • GPL version of FFmpeg (allows for x264 etc).

TODO

  • Expose more headers.
  • Ensure acceleration enabled in builds.
  • Expose platform specific headers.
  • Cleanup internal packages.

Setup

go get github.com/csnewman/ffmpeg-go

Example

example.gif

(The asciiplayer demo playing Big Buck Bunny, with some GIF artifacts)

The examples directory contains some ported and some custom examples based on the C docs.

An example of printing a file's metadata:

package main

import (
	"log"
	"log/slog"
	"os"

	"github.com/csnewman/ffmpeg-go"
)

func main() {
	slog.Info("Metadata")

	var ctx *ffmpeg.AVFormatContext

	url := ffmpeg.ToCStr(os.Args[1])
	defer url.Free()

	_, err := ffmpeg.AVFormatOpenInput(&ctx, url, nil, nil)
	if err != nil {
		log.Panicln(err)
	}

	defer ffmpeg.AVFormatFreeContext(ctx)

	if _, err := ffmpeg.AVFormatFindStreamInfo(ctx, nil); err != nil {
		log.Panicln(err)
	}

	ffmpeg.AVDumpFormat(ctx, 0, url, 0)

	streams := ctx.Streams()

	for i := uintptr(0); i < uintptr(ctx.NbStreams()); i++ {
		s := streams.Get(i)

		slog.Info("  Stream", "i", i, "id", s.Id(), "dur", s.Duration())

		meta := s.Metadata()

		var entry *ffmpeg.AVDictionaryEntry

		for {
			entry = ffmpeg.AVDictGet(meta, ffmpeg.GlobalCStr(""), entry, ffmpeg.AVDictIgnoreSuffix)
			if entry == nil {
				break
			}

			slog.Info("    Meta", "key", entry.Key(), "value", entry.Value())
		}
	}
}
2024/01/15 21:39:43 INFO Metadata
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './bbb.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2013-12-16T17:59:32.000000Z
    title           : Big Buck Bunny, Sunflower version
    artist          : Blender Foundation 2008, Janus Bager Kristensen 2013
    comment         : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
    genre           : Animation
    composer        : Sacha Goedegebure
  Duration: 00:10:34.57, start: 0.000000, bitrate: 4486 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 4001 kb/s, 60 fps, 60 tbr, 60k tbn (default)
    Metadata:
      creation_time   : 2013-12-16T17:59:32.000000Z
      handler_name    : GPAC ISO Video Handler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
    Metadata:
      creation_time   : 2013-12-16T17:59:37.000000Z
      handler_name    : GPAC ISO Audio Handler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](und): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 320 kb/s (default)
    Metadata:
      creation_time   : 2013-12-16T17:59:37.000000Z
      handler_name    : GPAC ISO Audio Handler
      vendor_id       : [0][0][0][0]
    Side data:
      audio service type: main
2024/01/15 21:39:43 INFO   Stream i=0 id=1 dur=38072000
2024/01/15 21:39:43 INFO     Meta key=creation_time value=2013-12-16T17:59:32.000000Z
2024/01/15 21:39:43 INFO     Meta key=language value=und
2024/01/15 21:39:43 INFO     Meta key=handler_name value="GPAC ISO Video Handler"
2024/01/15 21:39:43 INFO     Meta key=vendor_id value=[0][0][0][0]
2024/01/15 21:39:43 INFO   Stream i=1 id=2 dur=30441600
2024/01/15 21:39:43 INFO     Meta key=creation_time value=2013-12-16T17:59:37.000000Z
2024/01/15 21:39:43 INFO     Meta key=language value=und
2024/01/15 21:39:43 INFO     Meta key=handler_name value="GPAC ISO Audio Handler"
2024/01/15 21:39:43 INFO     Meta key=vendor_id value=[0][0][0][0]
2024/01/15 21:39:43 INFO   Stream i=2 id=3 dur=30438912
2024/01/15 21:39:43 INFO     Meta key=creation_time value=2013-12-16T17:59:37.000000Z
2024/01/15 21:39:43 INFO     Meta key=language value=und
2024/01/15 21:39:43 INFO     Meta key=handler_name value="GPAC ISO Audio Handler"
2024/01/15 21:39:43 INFO     Meta key=vendor_id value=[0][0][0][0]

FAQ

  • Q: Why is FFmpeg statically bundled?
    • A: The version of FFmpeg varies by platform, making a one-size fits all style binding difficult with the Go build system and its lack of a build.go file.
  • Q: Why are the arm packages not built by CI?
    • A: Ideally they would be. However, the free GitHub plan does not include arm builders.
  • Q: Why is library xyz not enabled?
    • A: Libraries have been added on a as-needed basis. Feel free to create a PR enabling any additional libraries.
  • Q: I have some C code that I can't convert to Go, due to a missing binding feature
    • A: Create an issue with a C sample, and we can go from there.

Library versions

LibraryVersion
FFmpeg6.1
aom3.8.1
ass0.17.1
brotli1.1
bz21.0.8
freetype2.13.2
fribidi1.0.13
harfbuzz8.3.0
mp3lame3.1000
ogg1.3.1
opus1.4
pnghead
speex1.2.1
theora1.1.1
unibreak5.1
vpx1.14.0
x264head
zlib1.3