やったことを忘れないようにするためのメモです。
🎥 はじめに
GoProなどのアクションカメラで撮影した動画では、フレームドロップ(一部のフレームが記録されない現象)が発生することがあります。
本記事では、ffprobeを使って各フレームのタイムスタンプを取得し、フレームドロップを検知する方法をまとめます!(文章のほとんどはChatGPTで作っています。)
🛠 環境構築
# Condaで新しい環境を作成
conda create -n ffmpeg-env ffmpeg
conda activate ffmpeg-env
- OS: Linux (WSL2でも可)
- 使用ツール:
ffprobe
(ffmpeg
に含まれます)
🔍 フレーム単位でタイムスタンプを取得する
1. ffprobeコマンド実行
動画ファイル(例:hero8.mp4
)に対して、以下のコマンドを実行します。
ffprobe -select_streams v -show_frames -print_format json samples/hero8.mp4 > output.txt
オプション説明:
-
-select_streams v
: 映像ストリームのみ対象 -
-show_frames
: 各フレーム情報をすべて出力 -
-print_format json
: JSON形式で出力 -
> output.txt
: ファイルに保存
これで、全フレーム情報がoutput.txt
に記録されます!
2. 出力結果の確認
output.txt
を見ると、各フレームについて次のような情報が記録されています。
{
"media_type": "video",
"stream_index": 0,
"pts_time": "0.000000",
...
},
{
"media_type": "video",
"stream_index": 0,
"pts_time": "0.033367",
...
}
pts_time
が、各フレームのタイムスタンプ(秒単位)を示しています!pts_time
は最初のフレームからの経過タイムスタンプを表しているので、そのフレームが何時何分何秒に撮影されたかを復元するには tmcd
を確認し、pts_time
の値を加えることで復元することができます。(Tentacle SYNCなどで記録されたタイムコードはこちらに入る)
📈 フレームドロップ検出の流れ
流れまとめ
-
pts_time
のリストを取得する - 隣接する2つの
pts_time
の差分(Δt)を計算する - 理想的なフレーム間隔(例:0.033367秒)と比較する
- Δtが異常に大きい場合 ⇒ フレームドロップ発生!
実際の例
正常な場合(30fps前後):
フレーム番号 | pts_time | Δt (秒) |
---|---|---|
1 | 0.000000 | - |
2 | 0.033367 | 0.033367 |
3 | 0.066733 | 0.033366 |
4 | 0.100100 | 0.033367 |
異常があった場合:
フレーム番号 | pts_time | Δt (秒) |
---|---|---|
100 | 3.333000 | - |
101 | 3.399000 | 0.066000 (※大きすぎる!) |
⚠️ 注意ポイント
- fps数は撮影モード(FPS設定)によって異なるので、必ず事前に確認!
- 撮影時のブレや熱暴走、保存メディアエラーなどがフレームドロップの原因になります
🏁 まとめ
本記事では、
- ffprobeで各フレームのタイムスタンプを取得
-
フレーム間の間隔からドロップを検出
という手順を紹介しました。
この方法を使えば、動画の品質検査やデータ解析前の事前チェックが確実にできるようになります!