世界を動かす技術を、日本語で。

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 の基本的なアーキテクチャと実装例を短時間で把握可能。 音声・映像処理アプリケーション開発 の導入として最適。

Hackerたちの意見

FFmpegやlibavの仕組みをもっと深く理解したい人には、Leandro Moreiraのチュートリアルを超おすすめするよ。[0] これが一番分かりやすくて、内容も充実してると思う。

元のコマンドはあんまり面白くなかったけど、あなたが貼ったチュートリアルはすごく役立ちそうだね。

もうFFmpeg 101に来てるの?FFmpeg 8が昨日のことみたいだ。

これが、エージェントにコードを押したり、承認したり、リリースさせたりすると、寝てる間に起こることだね!

FFmpegはまさにスーパーパワーだよ。動画のパーツを組み合わせて、再生可能なものにしてる。

もう一つガイドがあるよ。 https://news.ycombinator.com/item?id=33771445

FFmpeg、俺の愛しき存在。

いいFFmpegの紹介だね、ありがとう!