Go語言中FFmpeg庫的常見用法是用于音視頻處理和編解碼。該庫提供了一系列功能強大的方法,可以實現音視頻文件的讀取、寫入、轉碼、剪切、合并、截圖等操作。
以下是一些常見的用法示例:
formatCtx, err := ffmpeg.OpenInput("input.mp4")
if err != nil {
log.Fatal(err)
}
defer formatCtx.Close()
for _, stream := range formatCtx.Streams() {
codecCtx, err := stream.CodecContext()
if err != nil {
log.Fatal(err)
}
// 處理音頻流
if codecCtx.IsAudioCodec() {
// ...
}
// 處理視頻流
if codecCtx.IsVideoCodec() {
// ...
}
}
packet, err := formatCtx.ReadPacket()
if err != nil {
log.Fatal(err)
}
defer packet.Free()
if streamIndex == packet.StreamIndex() {
frame, err := codecCtx.Decode(packet)
if err != nil {
log.Fatal(err)
}
defer frame.Free()
// 處理音視頻幀
// ...
}
// 創建編碼器上下文
encoderCtx, err := codec.NewEncoderContext(codec)
if err != nil {
log.Fatal(err)
}
defer encoderCtx.Free()
// 編碼音視頻幀
packet, err := encoderCtx.Encode(frame)
if err != nil {
log.Fatal(err)
}
defer packet.Free()
// 寫入輸出文件
if err := formatCtx.WritePacket(packet); err != nil {
log.Fatal(err)
}
outputCtx, err := ffmpeg.NewOutputContext("output.mp4")
if err != nil {
log.Fatal(err)
}
defer outputCtx.Close()
for _, stream := range formatCtx.Streams() {
codecCtx, err := stream.CodecContext()
if err != nil {
log.Fatal(err)
}
// 創建編碼器上下文
encoderCtx, err := codecCtx.NewEncoder()
if err != nil {
log.Fatal(err)
}
// 添加音視頻流到輸出文件
outputStream := outputCtx.NewStream(encoderCtx.Codec())
if err := outputStream.CopyParameters(encoderCtx); err != nil {
log.Fatal(err)
}
}
// 轉碼音視頻流
if err := outputCtx.WriteHeader(); err != nil {
log.Fatal(err)
}
for {
packet, err := formatCtx.ReadPacket()
if err != nil {
if err == io.EOF {
break
}
log.Fatal(err)
}
// 轉碼音視頻幀
// ...
if err := outputCtx.WritePacket(packet); err != nil {
log.Fatal(err)
}
}
這些只是FFmpeg庫的基本用法示例,實際應用中,還可以根據需求進行更復雜的音視頻處理操作。