一个高性能的 Go 库,用于将 H.264 视频流解码为 ARGB8888 (RGBA) 格式,使用嵌入式 FFmpeg 二进制文件。该库提供简单的跨平台 API,无需外部依赖。
go get github.com/cnb-cool/h264-ffmpeg-argb8888@v1.0.0
package main
import (
"fmt"
"log"
h264decoder "github.com/cnb-cool/h264-ffmpeg-argb8888"
)
func main() {
// 创建带回调函数的解码器
decoder, err := h264decoder.NewDecoder(1920, 1080, func(frameIndex int, rgbaData []byte, width, height int) {
fmt.Printf("收到第 %d 帧: %dx%d, %d 字节\n", frameIndex, width, height, len(rgbaData))
// 在这里处理 RGBA 数据
// 保存到文件、显示或进一步处理
})
if err != nil {
log.Fatal(err)
}
defer decoder.Close()
// 启动解码器
if err := decoder.Start(); err != nil {
log.Fatal(err)
}
// 解码 H.264 帧数据
h264Data := []byte{...} // 你的 H.264 帧数据
if err := decoder.DecodeFrame(h264Data); err != nil {
log.Printf("解码错误: %v", err)
}
}
用于 H.264 到 ARGB8888 转换的主要解码器实例。
type FrameCallback func(frameIndex int, rgbaData []byte, width, height int)
用于接收解码 RGBA 帧的回调函数类型。
创建一个自动检测平台的新 H.264 解码器。
参数:
width: 输出帧宽度(像素)height: 输出帧高度(像素)callback: 解码帧时调用的函数返回值:
*Decoder: 解码器实例error: 任何初始化错误NewDecoderForPlatform(width, height int, targetPlatform string, callback FrameCallback) (*Decoder, error)为特定目标平台创建新的 H.264 解码器。
参数:
width: 输出帧宽度(像素)height: 输出帧高度(像素)targetPlatform: 目标平台("windows_amd64"、"android_arm64"、"android_arm" 或 "" 表示自动检测)callback: 解码帧时调用的函数初始化并启动解码器。必须在 DecodeFrame 之前调用。
解码单个 H.264 帧。解码的 RGBA 数据将通过回调函数传递。
停止解码器并释放所有资源。
返回到目前为止处理的帧数。
返回解码器是否正在运行。
返回用于监控解码器错误的通道。
返回配置的输出尺寸。
将 RGBA 像素数据保存为 PNG 图像文件。
解析 FLV 样式的 H.264 帧数据并将其转换为带起始码的原始 H.264。
返回所有支持的目标平台列表。
// 创建帧缓冲区来收集帧
frameBuffer := h264decoder.NewFrameBuffer(50) // 缓冲最多 50 帧
decoder, err := h264decoder.NewDecoder(1920, 1080, func(frameIndex int, rgbaData []byte, width, height int) {
// 将帧添加到缓冲区并附带元数据
frameInfo := h264decoder.FrameInfo{
Index: frameIndex,
Width: width,
Height: height,
DataSize: len(rgbaData),
Timestamp: time.Now().UnixNano(),
}
frameBuffer.AddFrame(frameInfo, rgbaData)
// 批量处理帧
if frameBuffer.Count() >= 10 {
frames := frameBuffer.GetFrames()
// 处理批次...
frameBuffer.Clear()
}
})
// 在单独的协程中监控错误
go func() {
for err := range decoder.GetErrorChannel() {
log.Printf("解码器错误: %v", err)
}
}()
// 为特定平台创建解码器
decoder, err := h264decoder.NewDecoderForPlatform(1920, 1080, "android_arm64", callback)
| 平台 | GOOS | GOARCH | 描述 |
|---|---|---|---|
| Windows 64位 | windows | amd64 | Windows 桌面/服务器 |
| Android ARM64 | linux | arm64 | Android 设备(64位 ARM) |
| Android ARM | linux | arm | Android 设备(32位 ARM) |
库会根据构建环境自动检测目标平台。你也可以显式指定目标平台:
// 自动检测平台
decoder, err := h264decoder.NewDecoder(1920, 1080, callback)
// 显式指定平台
decoder, err := h264decoder.NewDecoderForPlatform(1920, 1080, "windows_amd64", callback)
// 列出支持的平台
platforms := h264decoder.GetSupportedPlatforms()
h264-ffmpeg-argb8888/ ├── README.md # 本文档 ├── go.mod # Go 模块定义 ├── h264_decoder.go # 主解码器 API ├── utils.go # 工具函数 ├── examples/ # 使用示例 │ ├── basic_usage.go # 基本使用示例 │ └── advanced_usage.go # 高级功能示例 └── processor/ # 内部处理逻辑 ├── rtmp_processor.go # 核心 RTMP/H.264 处理器 ├── embedded_ffmpeg*.go # 平台特定的 FFmpeg 管理器 └── binaries/ # 嵌入式 FFmpeg 二进制文件 ├── windows_amd64/ # Windows 二进制文件 ├── android_arm64/ # Android ARM64 二进制文件 └── android_arm/ # Android ARM 二进制文件
// 实时处理 RTMP/H.264 流
decoder, err := h264decoder.NewDecoder(1920, 1080, func(frameIndex int, rgbaData []byte, width, height int) {
// 实时显示帧
displayFrame(rgbaData, width, height)
})
// 处理 H.264 视频文件
for _, h264Frame := range videoFrames {
if err := decoder.DecodeFrame(h264Frame); err != nil {
log.Printf("帧解码错误: %v", err)
}
}
// 分析解码帧
decoder, err := h264decoder.NewDecoder(1920, 1080, func(frameIndex int, rgbaData []byte, width, height int) {
// 执行图像分析
features := analyzeFrame(rgbaData, width, height)
processFeatures(features)
})
examples/ 目录包含全面的使用示例:
basic_usage.go: 简单的解码器设置和帧处理advanced_usage.go: 帧缓冲、批处理和错误监控运行示例:
cd examples
go run basic_usage.go
go run advanced_usage.go
Close() 释放资源解码器启动失败
帧解码错误
ParseH264Frame()内存问题
decoder.Close()// 检查解码器状态
fmt.Printf("运行中: %v\n", decoder.IsRunning())
fmt.Printf("已处理帧数: %d\n", decoder.GetFrameCount())
fmt.Printf("尺寸: %dx%d\n", decoder.GetDimensions())
// 监控错误
go func() {
for err := range decoder.GetErrorChannel() {
log.Printf("错误: %v", err)
}
}()
欢迎贡献!请随时提交问题、功能请求或拉取请求。
go test ./...go build ./examples/...本项目采用 MIT 许可证 - 详见 LICENSE 文件。
如有问题、问题或功能请求,请:
用 ❤️ 为 Go 社区制作