LoginSignup
9
4

More than 5 years have passed since last update.

秋茄子を嫁に食わせても良いけど、暗号化されたFragmented mp4はffmpegに食わせない方が良いかもしれない

Posted at

今日の小ネタは

割りとどうでも良い小ネタです。動画配信の仕事でもしていない限り、全く関わることは無いだろうから。
そんなffmpegの話。

本当に極稀にですが

ffmpeg -i some.mp4

とか

ffprobe some.mp4

とかmp4の情報を調べようとした際に、画角情報等がおかしな値で表示される場合があります。

con_ng.jpg

こんな感じで。なんすか、この96x32って言う画角は・・・。
ちなみに正しく表示された場合は

con_ok.jpg

こんな感じになります。
更に、正しく表示されないmp4をmp4boxやmediainfoに食わせてみると、画角情報は正しく表示されます。

実は、

このffmpegで画角情報が正しく表示されないmp4は、とあるDRMで暗号化されたMPEG-DASH用のFragmented mp4です。
とは言え、暗号化は映像データそのものに対して行なわれ、画角情報が入っている Track Header Box (tkhd) は暗号化されないので
暗号化されただけで正しく表示されなくなるのは変な話です。
暗号化されていても、mp4boxやmediainfoでは正しく画角情報が取得できますしね。
一体どういうこと?

そんなわけで

根気よくffmpegの出力を眺めつつ(このmp4はサイズが2GBもあるので大量にログがコンソールを流れていきます)
色々調べた結果分かったのは、ffmpegはmp4の画角情報を Sequence Parameter Set (SPS) から取得しているらしいという事。
そして、ffmpegはSPSがmp4のパースの最中に見つかる度に前のSPSの情報を上書きしている事。

詰まるところ

普通のmp4ならSPSはDecoderConfigrationRecord上に存在するだけで、そこから画角情報を取り出して終了だったのですが、
不幸なことにこのmp4はFragmented mp4だった為、各フラグメントの動画データの中にSPSが含まれてしまっていました。
暗号化されたSPSはパース出来なくてエラーになって元の正しいSPSが上書きされることはないはずなのですが、
これまた更に不幸なことに、本当に極稀に暗号化されたSPSのパースに成功してしまい滅茶苦茶な値で元のSPSが上書きされていた
と言うのが事の真相です。

というわけで、暗号化されたFragmented mp4をffmpegに食わせると良くないことが起こるかもしれないので、余り食わせない方が
良いかもしれないと言う話でした。
尚、CommonEncryption (CENC) の2nd Ed.以降ではメディアデータ以外は暗号化しない、と言う事になっているので今回のような事は
起こらないと思います。

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4