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例を示し、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に関する明確な(ただしより厳格な)互換性ストーリーを備えています。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト