SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

今日からできる! 動画配信基盤システム構築

そもそも動画ファイルって何? MP4ファイルの中身を見てみよう

今日からできる! 動画配信基盤システム構築 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

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

おわりに

 今回は動画ファイルがどんなものかを解説してきました。動画ファイルの仕組みについてふんわりとイメージを掴んでもらえれば、連載を追いかける上でとっかかりとして十分です。

 さて次回予告です。動画ファイルのイメージを掴み、次に待っているのは映像データがどのように圧縮されているかです。

 この記事でもさらっと、映像データはコーデックと呼ばれる仕組みによって動画ファイルに格納されていることに触れました。このコーデックもまた、動画配信技術を理解する上で欠かせない存在です。

 映像の品質とコストのバランスをとりながら、ユーザーに素晴らしい動画サービスの利用体験を提供するためにコーデックでできることを解説していきます。

 それでは次回もお会いしましょう。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
今日からできる! 動画配信基盤システム構築連載記事一覧
この記事の著者

中村 航(合同会社DMM.com)(ナカムラ ワタル)

 2020年にDMM.comへ新卒入社。現在の配信基盤グループに配属され、今日までエンコードシステムやバックエンドシステム等の開発・運用に携わっています。その後、2022年にスタートしたDMM TVの立ち上げにも関わりました。エンタメ大好きなエンジニアです!

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19591 2024/06/27 12:53

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング