asticode/go-astiav

Golang ffmpeg and libav C bindings

go-astiav让Go程序无需编写C代码即可使用FFmpeg(一个强大的开源工具,用于处理音频、视频和图像)。它通过将Go桥接到FFmpeg的C库来实现这一点,但将底层API重塑为Go开发者自然期望的风格。

它的功能

  • 在Go函数背后提供数千种FFmpeg功能(解码、编码、过滤、缩放等)。无需处理C指针和内存规则,Go代码以熟悉的方式读写数据。
  • 专注于惯用:错误遵循Go标准的if err != nil模式,常量和标志是类型化的,方法被分组到结构体中,而不是松散的C函数。
  • 附带镜像FFmpeg官方示例的示例程序,涵盖解封装(将媒体容器拆分为流)、视频/音频解码、过滤、缩放、转码,甚至硬件加速等主题。
  • 已__全面测试__(README将此列为已完成目标)。

兼容性

  • 仅适用于FFmpeg版本n9.0,不适用于更旧或更新的版本。
  • 对其自身API的破坏性更改将不会进行通常的v2 Go模块版本号提升;单独的变更日志会跟踪这些更改。

内存管理模式

README解释了一个关键模式:读取媒体帧或数据包时,您分配一个对象一次,在循环中重用它,然后显式释放它。示例:

  • pkt := astiav.AllocPacket() – 分配一个数据包一次。
  • defer pkt.Free() – 确保完成后释放它。
  • 在循环内,调用formatContext.ReadFrame(pkt)来填充重用的数据包,然后defer pkt.Unref()在继续之前清理注入的数据。

这使开发者能够控制内存使用,同时明确代码中资源释放的时机。

安装

  • 您必须使用特定设置从源代码构建FFmpeg。项目展示了用于此目的的Dockerfile示例,然后指导您设置环境变量(CGO_CFLAGS、CGO_LDFLAGS、PKG_CONFIG_PATH),以便Go的构建工具能够找到FFmpeg的库。
  • 在Windows上,您需要MSYS2/Mingw64的GCC工具链,以及pkg-config、make和nasm等包;README提供了逐步命令。

为什么存在这个项目

作者之前维护了goav,一个较旧的Go-FFmpeg绑定的流行分支,但发现它有太多未解决的问题。与其继续修补它,他们从头编写了go-astiav,以更干净、更符合Go惯用风格的设计修复这些问题。

简而言之:go-astiav是一个专门构建的桥梁,将FFmpeg丰富的媒体处理能力带入Go代码,具有现代Go API、经过测试的示例,以及围绕FFmpeg n9.0的清晰(尽管更严格)兼容性说明。

相关

  • 项目
  • 项目
  • 项目
  • 项目