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例を示し、GoのビルドツールがFFmpegのライブラリを見つけられるように環境変数(CGO_CFLAGS、CGO_LDFLAGS、PKG_CONFIG_PATH)を設定するよう指示します。
  • Windowsでは、MSYS2/Mingw64のGCCツールチェーンと、pkg-config、make、nasmなどのパッケージが必要です。READMEはステップバイステップのコマンドを提供します。

このプロジェクトが存在する理由

著者は以前、古いGo-FFmpegバインディングの人気フォークであるgoavを保守していましたが、未解決の問題が多すぎると感じました。パッチを当て続ける代わりに、よりクリーンでGoらしい設計でそれらの問題を修正するために、go-astiavをゼロから書きました。

要約:go-astiavは、FFmpegの豊富なメディア処理能力をGoコードにもたらす専用のブリッジであり、モダンなGo API、テスト済みの例、そしてFFmpeg n9.0に関する明確な(ただしより厳格な)互換性ストーリーを備えています。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト