今日の小ネタは
割りとどうでも良い小ネタです。動画配信の仕事でもしていない限り、全く関わることは無いだろうから。
そんなffmpegの話。
本当に極稀にですが
ffmpeg -i some.mp4
とか
ffprobe some.mp4
とかmp4の情報を調べようとした際に、画角情報等がおかしな値で表示される場合があります。
こんな感じで。なんすか、この96x32って言う画角は・・・。
ちなみに正しく表示された場合は
こんな感じになります。
更に、正しく表示されない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.以降ではメディアデータ以外は暗号化しない、と言う事になっているので今回のような事は
起こらないと思います。