FFmpegによるハンズオン(2)
ffprobeで動画ファイルを解析しよう
FFmpegとBig Buck Bunnyの用意が完了したところで、解析ツールであるffprobeを使ってみましょう。先ほども述べた通り、ffprobeはコーデックやコンテナ・フレームなどの情報を解析するツールです。
以下のコマンドの例と出力例を示します。
ffprobe -i <ダウンロードした映像のファイルパス> -show_format -show_streams
% ffprobe -i bbb_sunflower_1080p_60fps_normal.mp4 -show_format -show_streams (中略) [STREAM] index=0 codec_name=h264 codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 profile=High codec_type=video (中略) width=1920 height=1080 (中略) r_frame_rate=60/1 avg_frame_rate=60/1 duration=634.533333 (中略) [/STREAM] [STREAM] index=1 codec_name=mp3 codec_long_name=MP3 (MPEG audio layer 3) profile=unknown codec_type=audio (中略) sample_rate=48000 channels=2 channel_layout=stereo (中略) duration=634.200000 (中略) [/STREAM] [STREAM] index=2 codec_name=ac3 codec_long_name=ATSC A/52A (AC-3) profile=unknown codec_type=audio (中略) sample_rate=48000 channels=6 channel_layout=5.1(side) duration=634.144000 (中略) [SIDE_DATA] side_data_type=Audio Service Type service_type=0 [/SIDE_DATA] [/STREAM] [FORMAT] (中略) format_name=mov,mp4,m4a,3gp,3g2,mj2 format_long_name=QuickTime / MOV (中略) [/FORMAT]
ここでの引数の意味は以下の通りです。
引数 | 意味 |
---|---|
-show_format | コンテナの詳細を表示する |
-show_streams | コーデックによって圧縮したデータの詳細を表示する |
ストリームの読み方
「[STREAM] ~ [/STREAM]」で囲われた部分が各コーデックによって圧縮された映像や音声などのデータ を示しています。その内側にある「キー=値」の形式から詳細を読み取ることができます。
各ストリームが映像か音声かは「codec_type」キーの値が「video」か「audio」かによって判断することが可能です。このファイルには3つのストリームが存在し、映像ストリームが1個と音声ストリームが2個の構成になっています。
ここで各キーと値の意味について、代表的な部分に絞って解説します。
キー | 値 |
---|---|
codec_name | コーデック名 |
codec_long_name | 詳細なコーデック名 |
profile | コーデックで利用したプロファイル |
width | 横の解像度 |
height | 縦の解像度 |
duration | 再生時間 |
r_frame_rate | オリジナルファイルのフレームレート |
avg_frame_rate | 平均フレームレート |
ここで「r_frame_rate」はオリジナルの映像ファイルで設定されたフレームレートを示します。一方で「avg_frame_rate」は全体の平均フレームレートを示します。
フレームに欠損等が無く、各フレームの表示時間が一定であれば「r_frame_rate」と「avg_frame_rate」の値は同じになります。
キー | 値 |
---|---|
codec_name | コーデック名 |
codec_long_name | 詳細なコーデック名 |
profile | コーデックで利用したプロファイル |
sample_rate | サンプルレート 単位はヘルツ[Hz] |
channels | チャンネル数 |
channel_layout | チャンネル・レイアウト |
ステレオや空間オーディオのように、複数のスピーカーからそれぞれ異なる音を再生する場合、各スピーカーに割り当てられた音をチャンネルと呼びます。
各ストリームは複数のチャンネルを格納することができ、スピーカーの配置方法はチャンネルレイアウトから読み取ることができます。
コンテナの読み方
次にコンテナの詳細を読んでみましょう。
[FORMAT] ~ [/FORMAT]で囲われた箇所がコンテナに関する情報を示しています。ストリームと同様に「キー=値」の形式から詳細を読み取ることができます。
キー | 値 |
---|---|
format_name | フォーマット(≒コンテナ)の名前 |
format_long_name | 詳細なフォーマット(≒コンテナ)の名前 |
ffmpegで動画ファイルを編集しよう
次にffmpegを使って実際に映像ファイルを編集してみましょう。
ffmpegには非常に多くの機能がありますが、今回はコーデックとコンテナの関係を理解することに重点を置いて解説します。
コンテナを変更する
コンテナとストリームはそれぞれ別の概念であるため、映像や音声のストリームはそのままにコンテナだけを差し替えることが可能です。
ffmpeg -i <ダウンロードした映像のファイルパス> -c:v copy -c:a copy ./video.mkv
映像と音声のストリームを分離する
先ほどの応用として、映像と音声をそれぞれ別のコンテナに書き出すことも可能です。
以下の例では-mapオプションで映像と音声のストリームを再処理せずに別々のファイルへ書き出しています。
ffmpeg -i <ダウンロードした映像のファイルパス> -map 0:v:0 -c:v copy video.mp4 -map 0:a:0 -c:a copy audio.mka
おわりに
今回は動画ファイルがどんなものかを解説してきました。動画ファイルの仕組みについてふんわりとイメージを掴んでもらえれば、連載を追いかける上でとっかかりとして十分です。
さて次回予告です。動画ファイルのイメージを掴み、次に待っているのは映像データがどのように圧縮されているかです。
この記事でもさらっと、映像データはコーデックと呼ばれる仕組みによって動画ファイルに格納されていることに触れました。このコーデックもまた、動画配信技術を理解する上で欠かせない存在です。
映像の品質とコストのバランスをとりながら、ユーザーに素晴らしい動画サービスの利用体験を提供するためにコーデックでできることを解説していきます。
それでは次回もお会いしましょう。