2011.4.30更新
これからの動画ファイルはmp4だ!ということで、今回は地デジチューナーから取り出したTSファイルをffmpegでエンコードする方法についてまとめます。
私は面倒なのでCMカット等の編集作業は行いません。録画したTSファイルを自動的に圧縮(エンコード)して、効率よく保存する事に重きを置いていますので、編集について情報収集したい方にはこのページはあまり役に立たないと思います。
yumにてffmpeg-develをインストールします。通常版だと音声のエンコードでエラーを出して無音のmp4ファイルが出来上がってしまうため、devel版を用います。
私は、この問題はffmpegの設定で回避するものと思い込み、ハマってしまいました。
# yum install ffmpeg-devel.i386
Error while decoding stream #0.1 Error while decoding stream #0.1 Error while decoding stream #0.1 Error while decoding stream #0.1
この問題は、ぱぱネット(仮)(2009-07-01)さんの所で説明されており、解決するための差分パッチも用意されているようです。
しかし、わざわざソースからコンパイルする事は避けたかったので採用しません。
エンコードの際は、画像のサイズや画質など多くの設定を指定する必要があります。
細かな画質の設定はオプションでプリセットファイルを指定します。ファイルはがべこれログさんのページを参考にしました。
-vpre /var/xxx/yyy/libx264.ffpreset (ver.0.5.2の場合) -fpre /var/xxx/yyy/libx264.ffpreset (ver.0.6.1の場合)
チューナーから取り出したTSファイル(生TS)は、何も加工しなければフルセグの他に、ワンセグや文字情報のデータも入ったままの状態です。
エンコードの時にどのデータを使うのかを指定しなければ、ワンセグデータをエンコードしてしまう事もあるのでオプションで指定する必要があります。
このページでは、2通りの指定方法を紹介します。
ここでは、Program IDを指定してエンコードするオプションを紹介します。Program IDはffmpegで簡単に調べることができます。
$ ffmpeg -y -i [生TSファイル]
上記コマンドを実行すると、以下のような結果が出力されます。(エンコードは行われない)
Last message repeated 1 times [h264 @ 0x85aab10]decode_slice_header error [h264 @ 0x85aab10]no frame! Seems stream 0 codec frame rate differs from container frame rate: 59.94 (60000/1001) -> 29.97 (30000/1001) Seems stream 2 codec frame rate differs from container frame rate: 29.97 (30000/1001) -> 14.99 (15000/1001) Input #0, mpegts, from 'GR16_20100807215400_20100807220000.mp4_tmp.ts': Duration: 00:06:00.23, start: 85253.616078, bitrate: 14806 kb/s Program 2064 ~ÍÂÓKhF|J|Aw Stream #0.0[0x111]: Video: mpeg2video, yuv420p, 1440x1080 [PAR 4:3 DAR 16:9], 20000 kb/s, 29.97 tbr, 90k tbn, 59.94 tbc Stream #0.1[0x112]: Audio: aac, 48000 Hz, stereo, s16, 193 kb/s Program 2065 ~ÍÂÓKhF|J|Aw² Stream #0.0[0x111]: Video: mpeg2video, yuv420p, 1440x1080 [PAR 4:3 DAR 16:9], 20000 kb/s, 29.97 tbr, 90k tbn, 59.94 tbc Stream #0.1[0x112]: Audio: aac, 48000 Hz, stereo, s16, 193 kb/s Program 2066 ~ÍÂÓKhF|J|Aw³ Stream #0.0[0x111]: Video: mpeg2video, yuv420p, 1440x1080 [PAR 4:3 DAR 16:9], 20000 kb/s, 29.97 tbr, 90k tbn, 59.94 tbc Stream #0.1[0x112]: Audio: aac, 48000 Hz, stereo, s16, 193 kb/s Program 2448 ~ÍÂÓKhF|J|Aw7HBS Stream #0.2[0x281]: Video: h264, yuv420p, 320x180, 14.99 tbr, 90k tbn, 29.97 tbc Stream #0.3[0x283]: Audio: aac, 24000 Hz, stereo, s16, 46 kb/s Program 2199 ~Ç|¬¤É At least one output file must be specified
上記結果より、Program IDの後ろで文字化けしていますが、解像度を見ると、2064、2065、2066がHD(なぜ3つもあるのか不明・・・)、2448がワンセグ、2199が文字情報である事がわかります。
-programid 2064
とすることでHD画像をエンコードできることになります。
しかし、このオプションだけではなぜかワンセグ画像が選択される事があるのです。原因は不明ですが、出力ファイルの解像度を指定する事で回避できる事がわかりました。さらに、解像度さえ指定してしまえば、HDが選択されるようです。(つまり -sオプションは必須)
私的には、精神的に安心を得るために一応Program IDを指定した方が良いと思います。
-programid | -s | 結果 |
有り | 無し | NG ワンセグデータでエンコードされる場合がある |
無し | 有り | OK |
有り | 有り | OK(採用!) |
2011.4.30追加
ProgramIDを指定した方法でなぜかエンコードに失敗することがありました。
そこで、もう一つのエンコード方法を紹介します。それがストリームマップの指定です。
ffmpeg -iで生TSの情報をみるとわかるように、ストリームが#0.0, #0.1, #0.2, #0.3の4種類存在することがわかります。そこで、この番号(ストリームマップ)を使ってフルセグデータを指定します。
-map 0.0 -map 0.1
(これでどのストリームデータを使うか指定されるので、-programidオプションは不要)
地デジはフルHDサイズで視聴されますが、放送データ自体の画像サイズは1440x1080のデータです。
テレビ等の受信側で、1440のサイズを1920に引き延ばして映しています。
ffmpeg -iの実行結果からもわかりますが、1440x1080と16:9という情報を元に引き延ばしが行われています。
じゃあ画像サイズはどのように指定すれば良いのか?という問題が生じます。
そこで、5分の生TSファイル523.2MBをいくつか条件を変えてエンコードして、エンコードの速さ、ファイルサイズを比較してみました。
条件 | -s | -aspect | エンコード時間 | ファイルサイズ | 再生(VLC) | 再生(QT) |
(1) | 1920x1080 | 無し | 30分58秒 | 56.1MB | 可 | 可 |
(2) | 1440x1080 | 16:9 | 22分8秒 | 46.0MB | 可 | 可 |
(3) | 640x360 | 無し | 4分47秒 | 12.3MB | 可 | 可 |
(4) | 480x360 | 16:9 | 4分23秒 | 10.9MB | 可 | 可 |
条件(1)と(2)、条件(3)と(4)はそれぞれ同じ画像サイズのファイルが出来上がりますが、画像サイズは生TSと同じ比にして、aspectで16:9に指定した方がファイルサイズが小さく、エンコードも速いことがわかりました。
上記コマンドでは、エンコードに成功はするものの、音声が映像よりコンマ数秒遅れます。視聴していても気になる程なので、改善が必要です。
そこで、画像と音声の同期をとるオプション -vsync 1を追加します。
最終的なコマンドです。
$ ffmpeg -y -i [生TSファイル] -f mp4 -vcodec libx264 -vpre /var/xxx/yyy/lib264.ffpreset -r 30000/1001 -aspect 16:9 -s 1440x1080 -bufsize 20000k -maxrate 25000k -vsync 1 -acodec libfaac -ac 2 -ar 48000 -ab 128k -map 0.0 -map 0.1 [出力ファイル]
がべこれログ - Garbage Collection Logffmpegエンコード設定について詳しく解説
最新の10件を表示しています。 コメントページを参照