[2013]新しいFFmpegを使ったらTS→MPEG2変換が高速になってた!

Pocket

FFmpegについて

最近あんまりts関係に動きがなかった(というか現状に満足していた)のですが,2012年の10月にFFmpeg1.0がリリースされていたようです.以前問題だったAACエンコーダーも自前で用意するようになったのでFFmpegだけで変換が出来るようになっています.

そういえばうちのFFmpeg.exeはかなり昔のを使っていたなぁと思って検索したら,どうも2011年で止まってるようです.

Ads


このときはFFmpeg rev.33762というバージョンでした.2013年3月21日現在ではFFmpeg1.1.3となっているようです.

FFmpegというえば動画変換のオープンソースソフトウェアであり,多くのソフトウェアがFFmpegを使っているんだそうです.そのFFmpegですが2011年3月にFFmpegを作っていたメンバーが分裂して「Libav」というプロジェクトを立ち上げるというニュースもありましたね.

LibavではWindows用のバイナリを配布していますがどうもそのままじゃ動かない様子.

一方,本家?FFmpeg
の方はというと,いつの間にかWindowsバイナリへのリンクが用意されるようになっていました.

FFmpegの上のナビゲーションバーにある「Download」にはWindowsバイナリを公開しているZeranoe FFmpeg Buildsへのリンクがついていました.

今回は一番上の32bit staticにある最新版のFFmpegをダウンロードしました.ファイルが.7zで圧縮してあるのでフリーソフトでは7-zip
Lhaz
なんかで解凍できます.
Windowsのバイナリを解凍するとbinフォルダの中にffmpeg.exeの他にffprobe.exe,ffplay.exeが入っていました.ffplay.exeはドラッグアンドドロップで動画を再生することが出来,ffprobe.exeはファイルのチェックをしてくれるようです.ちなみに最新のffprobe.exeにtsファイルを食べさせたところ,get_buffer() failedとPES packet size mismatchというウォーニングが出ていました.


C\BonTsDemux>ffprobe test.000.ts
ffprobe version N-51106-g17c1881 Copyright (c) 2007-2013 the FFmpeg developers
  built on Mar 19 2013 13:49:37 with gcc 4.7.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-av
isynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enab
le-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libg
sm --enable-libilbc --enable-libmp3lame --enable-libopencore-amrnb --enable-libo
pencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-li
bschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-lib
twolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enabl
e-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 19.101 / 52. 19.101
  libavcodec     55.  1.100 / 55.  1.100
  libavformat    55.  0.100 / 55.  0.100
  libavdevice    55.  0.100 / 55.  0.100
  libavfilter     3. 47.104 /  3. 47.104
  libswscale      2.  2.100 /  2.  2.100
  libswresample   0. 17.102 /  0. 17.102
  libpostproc    52.  2.100 / 52.  2.100
[aac @ 03517ee0] get_buffer() failed
[mpegts @ 0038f640] PES packet size mismatch
Input #0, mpegts, from 'test.000.ts':
  Duration: 00:02:50.00, start: 3600.069000, bitrate: 14039 kb/s
  Program 1
    Stream #0:0[0x11]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p
, 1440x1080 [SAR 4:3 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x14]: Audio: aac ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fl
tp, 203 kb/s

実際には色がついているのですが,aac関連の「get_buffer() failed」とmpegts関連の「PES packet size mismatch」という警告(ウォーニング)が出ています.とはいえFFmpegで変換出来るので問題ないのではないかと思っていますが…

FFmpeg.exeを使ったts→mpeg2への変換とバージョン毎の変換速度の差異

FFmpeg.exeを使えばtsファイルをそのままmpeg2へ変換することが可能です.私が使っているバッチファイル「toDVD.bat」はこんな感じになっています.

ドライブ名\ffmpegのあるフォルダ\ffmpeg.exe -i %1 -target ntsc-dvd -b:v 5000k -acodec ac3 -ar 48000 -threads 4 -vcodec mpeg2video -s 720x480 -r 29.97 -aspect 16:9 -b:a 192k -ac 2 %~n1.mpeg

ここでは5Mbpsのビットレートでtsを16:9のmpeg2に変換するような設定にしています.4コアなので-threadsオプションを入れて実行してみました.なんか警告は出るものの無事に変換は終わるので大丈夫ではないかと…

今回はこのバッチファイルを用いて2分50秒の地デジ番組(mpeg2-TS)と25分の地デジHD番組とcsの標準放送(60分)を2つのffmpeg.exeでmpeg2変換してみました.今回使用したffmpegは,
(1) [2011]fmpeg version N-33762-g284aa07 built on Oct 19 2011
(2) [2013]ffmpeg version N-51106-g17c1881,built on Mar 19 2013
の順.手元にあったffmpeg.exeで試してます.
試した環境はWindows7 Home Premium SP1 32bit,4G Memory, AMD Phenom X4 945

実験1[地デジ2分50秒の番組]
(1) [2011] 88秒(56秒 -threads 4)
(2) [2013] 45秒(36秒 -threads 4)

実験2[地デジ25分番組]
(1) [2011] 18分36秒(11分10秒 -threads 4)
(2) [2013]  8分10秒(7分34秒 -threads 4)

実験3[CS60分番組]
(1) [2011] 14分14秒(9分17秒 -threads 4)
(2) [2013] 8分10秒(7分12秒 -threads 4)

本当は何回も実行して平均をとる必要があるのでしょうが,とりあえずこんなもんでしたということで.
-threads 4オプションをつけると明らかに変換速度が速くなりました.-threads 4同士で比較しても2011から2013ではかなり短縮できたのではないでしょうか.