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的破坏性更改将不会进行通常的
v2Go模块版本号提升;单独的变更日志会跟踪这些更改。
内存管理模式
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的清晰(尽管更严格)兼容性说明。
相关
- 项目
- 项目
- 项目
- 项目