2009/03/10(Tue)ffmpegでストリーミング映像(wmv2)をシーク可能にする

2009/03/10 22:34 Software::Linux
私的な利用目的で、某サイトからストリーミング動画をwgetproを使ってダウンロードした*1のだが、もともとストリーミング用とあってシークが効かない。
どうにかしてシーク可能にしようとしてた時のメモ。

*1 : プロトコルがmmsだったのでwgetが使えない

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