2009/03/10(Tue)ffmpegでストリーミング映像(wmv2)をシーク可能にする
2009/03/10 22:34
どうにかしてシーク可能にしようとしてた時のメモ。
WMVConcat
まずググってみたら、WMVConcatというのがヒットした。これはWindows Media SDKを利用して、シーク情報を格納するインデックスを修復することでシーカブル(シーク可能)にしているようで、同じ事をさせたいのだが、多分Linux上では動かない。
解決方法
そこでどうしたかというと、単にffmpegを通す。といっても、再エンコードすると時間が勿体ないので、videoもaudioも"copy"でやってみた。
思いつきだけど、結果的にffmpegがインデックスを再構築……というか、コンテナを正常にしてくれているみたいで、シーク可能になった。
ffmpegのコンパイル状況と使用可能コーデック(抜粋)
$ ffmpeg -formats | grep wmv FFmpeg version SVN-r16304, Copyright (c) 2000-2008 Fabrice Bellard, et al. configuration: --enable-pthreads --enable-libfaac --enable-libx264 --enable-libmp3lame --enable-libxvid --enable-gpl --extra-cflags=-I/home/kero/applications/include --extra-ldflags=-L/home/kero/applications/lib --prefix=/home/kero/applications libavutil 49.12. 0 / 49.12. 0 libavcodec 52. 8. 0 / 52. 8. 0 libavformat 52.23. 1 / 52.23. 1 libavdevice 52. 1. 0 / 52. 1. 0 built on Jan 10 2009 00:28:37, gcc: 4.1.2 20070925 (Red Hat 4.1.2-33) DEVSD wmv1 Windows Media Video 7 DEVSD wmv2 Windows Media Video 8 D V wmv3 Windows Media Video 9今回試したソースはwmv2だったので、たまたまコーデックがcopyモードでコンテナが修復されたのかもしれない。wmv3をエンコードしようとおもったら、Windows環境でないと現状無理かな。
エンコード状況
Seems stream 1 codec frame rate differs from container frame rate: 1000.00 (1000/1) -> 29.97 (30000/1001) Input #0, asf, from '/home/kero/test/test_in.wmv': Duration: 00:02:02.90, start: 5.000000, bitrate: 313 kb/s Stream #0.0: Audio: wmav2, 32000 Hz, stereo, s16, 32 kb/s Stream #0.1: Video: wmv2, yuv420p, 320x240, 259 kb/s, 29.97 tb(r) Output #0, asf, to '/home/kero/test/test_out.wmv': Stream #0.0: Video: wmv2, yuv420p, 320x240, q=2-31, 259 kb/s, 1000.00 tb(c) Stream #0.1: Audio: wmav2, 32000 Hz, stereo, s16, 32 kb/s Stream mapping: Stream #0.1 -> #0.0 Stream #0.0 -> #0.1 Press [q] to stop encoding frame= 3799 fps= 0 q=-1.0 Lsize= 4701kB time=126.73 bitrate= 303.9kbits/s video:4004kB audio:500kB global headers:0kB muxing overhead 4.377523%中身はただのコピーなのでエンコードは一瞬で終わる。
エンコードの一番上の行に表示されているSeems stream 1 codec frame rate differs from container frame rate: 1000.00 (1000/1) -> 29.97 (30000/1001)というのが答えで、変なフレームレートを正常に書き換えてくれたおかげだな。
当然、diffると中身は違う。
$ diff test_in.wmv test_out.wmv バイナリー・ファイルtest_in.wmvとtest_out.wmvは違います $ ls -l test_in.wmv test_out.wmv -rw-r--r-- 1 kero kero 4813974 2009-03-10 22:06 test_in.wmv -rw-rw-r-- 1 kero kero 4814193 2009-03-10 22:10 test_out.wmv