ハクソク

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

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の紹介だね、ありがとう!