Go言語におけるFFmpegライブラリーの利用法は?
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() {
// ...
}
}
- ネイティブな日本語でフレーズを言い換えてください。1つのオプションのみが必要です:Decode audio and video frames:
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 ライブラリーのだけ基本的な用途例です。実際には、ニーズに応じて、より複雑な音響映像処理操作を実施できます。