FFmpeg 101 (2024)
概要
- FFmpegの高レベルアーキテクチャと基本的な使い方の概要
- ツール群とライブラリの役割と構成要素の紹介
- メディアストリームのデマックス・デコード処理の流れを解説
- 主要な構造体と関数の使用例をコード付きで説明
- ビルド・実行手順と出力例の紹介
FFmpegの高レベルアーキテクチャ概要
- FFmpegは多様な音声・動画フォーマットのエンコード・デコード・トランスコード・ストリーミングを支援するツール群とライブラリ群から構成
- 公式リポジトリ名:ffmpeg-101
FFmpegツール一覧
- ffmpeg:コマンドラインでマルチメディアファイルを他フォーマットへ変換するツール
- ffplay:SDLおよびFFmpegライブラリを利用したシンプルなメディアプレイヤー
- ffprobe:メディアストリームの解析ツール
FFmpegライブラリ一覧
- libavformat:I/Oとマルチプレクサ/デマルチプレクサ処理
- libavcodec:エンコード・デコード処理
- libavfilter:メディア用のグラフベースフィルター
- libavdevice:I/Oデバイス対応
- libavutil:マルチメディア共通ユーティリティ
- libswresample:音声リサンプリング・フォーマット変換・ミキシング
- libswscale:色空間変換・画像スケーリング
- libpostproc:映像後処理(デブロック・ノイズ除去)
FFmpegシンプルプレイヤーの処理流れ
- デマルチプレクサでファイルやネットワークから音声・動画ストリームを抽出し、デコーダで生データへ変換
- 主な構造体:
- AVFormatContext:ストリーム同期・メタデータ・マルチプレクサ管理
- AVStream:連続ストリーム(音声/動画)
- AVCodec:エンコード・デコード方式定義
- AVPacket:エンコード済みデータ
- AVFrame:デコード済み生データ(映像フレーム/音声サンプル)
デマルチプレクス・デコードの基本ロジック
- AVFormatContextの確保・初期化
AVFormatContext* format_context = avformat_alloc_context();
- 入力ファイルのオープン
avformat_open_input(&format_context, filename, NULL, NULL);
- ファイル内容の解析・ストリーム情報取得
avformat_find_stream_info(format_context, NULL);
- ストリーム一覧の出力
- ループで各AVStream情報を表示
- ファイルクローズ・リソース解放
avformat_close_input(&format_context);
コーデックの検索とセットアップ
- 各AVStreamから対応するAVCodecを検索
const AVCodec* codec = avcodec_find_decoder(stream->codecpar->codec_id);
- コーデック情報の出力(ビデオ/オーディオのパラメータ表示)
デコーダコンテキストの初期化
- AVCodecContextの確保
AVCodecContext* codec_context = avcodec_alloc_context3(first_video_stream_codec);
- コーデックパラメータの適用
avcodec_parameters_to_context(codec_context, first_video_stream_codec_params);
- デコーダのオープン
avcodec_open2(codec_context, first_video_stream_codec, NULL);
パケットとフレームの処理
- AVPacket/AVFrameの確保
- av_read_frameでパケット取得、該当ストリームならデコーダへ送信
- avcodec_send_packet/avcodec_receive_frameでデコード処理
- デコード済みフレームの情報出力
- パケット/フレーム/デコーダ/フォーマットコンテキストのリソース解放
ビルドおよび実行手順
- Meson/Ninjaによるビルドシステム利用
pip3 install meson ninjaでインストール可能
- セットアップ手順:
- アーカイブ展開後
ffmpeg-101ディレクトリへ移動 meson setup build(FFmpeg自動ダウンロード&ビルド準備)ninja -C buildでビルド./build/ffmpeg-101 sample.mp4で実行
- アーカイブ展開後
実行結果例
- ファイル・ストリーム・コーデック情報の出力
- 各ストリームのパケット受信・デコード処理状況の出力
- 映像フレームのタイプ・PTS・キーフレーム判定の表示
- 音声ストリームのパケットPTSの連続出力
この概要をもとに、FFmpegの基本的なアーキテクチャと実装例を短時間で把握可能。音声・映像処理アプリケーション開発の導入として最適。