Raveler/ffmpeg-cpp
A clean, easy-to-use C++ wrapper around the ffmpeg libraries
概要
ffmpeg-cpp は FFmpeg ライブラリをラップする C++ ライブラリであり、一般的なビデオ/オーディオタスク(メディアファイルの読み込み、フィルタリング、エンコード、書き込みなど)のためのクリーンで使いやすいインターフェースを提供します。FFmpeg コマンドラインツールを実行する代わりに、C++ 関数を直接呼び出します。また、DllImport を介して C# プロジェクトから呼び出せる簡略化されたインターフェースも含まれています。
機能
わずか数行の C++ コードで、ビデオファイルの読み込み、フィルタ(スケーリングや回転など)の適用、新しいファイルへの保存が可能です。README には、デマルチプレクス(コンテナの読み込み)、デコード、フィルタリング、エンコード、マルチプレクス(書き出し)という完全なパイプラインの例が示されています。
入手方法
- プラットフォーム: 現在は Windows と Visual Studio のみが公式にサポートされています。作者によればコード自体はプラットフォーム非依存ですが、CMake/Linux の経験が不足しているため、Linux ビルドはまだ提供されていません。
- インストール: リポジトリをクローンし、Zeranoe から適切な FFmpeg dev(ヘッダーおよびインポートライブラリ用)と shared(DLL 用)ビルド(FFmpeg 4.1 でテスト済み)をダウンロードして
ffmpegフォルダに展開し、Visual Studio ソリューションを開いてビルドします。これにより、独自のプロジェクトで使用するための.libとincludeフォルダが生成されます。
使用方法
C++ の場合
Muxer、VideoCodec、VideoEncoder、Filter、Demuxer などのオブジェクトを作成して処理パイプラインを構築します。README には、以下の手順を行う完全な例が示されています:
- 出力ファイル用の muxer を作成する。
- コーデック(例:MPEG‑2)とエンコーダーを作成する。
- フィルタ(例:
scale=640:150,transpose=cclock,vignette)を作成し、エンコーダーを接続する。 - demuxer で入力ファイルを読み込み、最適なビデオストリームをフィルタに送信する。
- パイプラインを準備し、完了するまでフレームをステップ実行し、muxer を閉じて終了する。
複雑さを軽減する簡略化されたインターフェースもあり、ハンドルを作成してビデオ/オーディオストリームとフィルタを追加し、ffmpegCppGenerate を呼び出すだけです。このインターフェースにより、C# との相互運用が容易になります。
C# の場合
簡略化されたインターフェースは、C スタイルの関数を持つ DLL (simple_interface.dll) として公開されています。README には、[DllImport] を使用して ffmpegCppCreate、ffmpegCppAddVideoStream、ffmpegCppAddVideoFilter、ffmpegCppGenerate などの関数を呼び出す完全な C# の例が記載されています。エラーチェックは ffmpegCppIsError および ffmpegCppGetError を通じて行われます。
存在理由
作者は、FFmpeg の実行ファイルを別プロセスとして起動することなく、プログラムに FFmpeg を統合する必要がありました。外部実行ファイルの起動は、ウイルス対策ソフトによってブロックされたり、その他の問題を引き起こす可能性があるためです。FFmpeg ライブラリを直接リンクすることで、機能がアプリケーションに組み込まれます。
制限事項と今後の計画
- プラットフォームサポート: 現在は Windows のみ。ロードマップには Linux/Mac ビルドサポートの追加が記載されています。
- テスト: 一般的な機能についてはテストされていますが、適切なユニットテストはまだ導入されていません。
- コーデック/コンテナの網羅性: 一部でテスト済みですが、ロードマップではより多くのコーデックとコンテナでのテストが求められています。
ライセンス
このライブラリは LGPL の下でライセンスされています。ただし、FFmpeg 自体はビルド方法に応じて LGPL または GPL になります。GPL バージョンの FFmpeg を使用する場合、ffmpeg-cpp を使用するプロジェクトも GPL に準拠する必要があります。
上記の情報はすべてプロジェクトの README から直接引用したものです。それ以外の追加や推論は行っていません。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト