2014.03.26更新 はじめに †これからの動画ファイルはmp4だ!ということで、今回は地デジチューナーから取り出したTSファイルをffmpegでエンコードする方法についてまとめます。 環境 †
ffmpegのインストール †yumにてffmpeg-develをインストールします。通常版だと音声のエンコードでエラーを出して無音のmp4ファイルが出来上がってしまうため、devel版を用います。 # yum install ffmpeg-devel 参考(エンコード中にでてくるエラー) †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)さんの所で説明されており、解決するための差分パッチも用意されているようです。 mp4エンコードの設定 †エンコードの際は、画像のサイズや画質など多くの設定を指定する必要があります。 -fpre /var/www/html/epgrec/libx264.ffpreset (ver.0.6.x以後の場合)
ffmpegのオプション設定 †チューナーから取り出したTSファイル(生TS)は、何も加工しなければワンセグや文字情報のデータも入ったままの状態です。 StreamIDを調査する方法 †StreamIDは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 上記結果より、StreamIDが#0.0, #0.1, #0.2, #0.3の4種類存在することがわかります。そこで、この番号(ストリームマップ)を使ってHD動画を指定します。 -map 0.0 -map 0.1 とすることでHD画像をエンコードできることになります。 epgrecに対応させる方法 †TSファイルをエンコードする際、StreamIDをいちいち確認するのは面倒です。 ダウンロード後、拡張子txtは削除してください。 PERL=/usr/bin/perl <- perlの実行パス ENCPROG=/var/video/tsencode.pl <- tsencode.plを置いた場所 elif [ ${MODE} == 1 ]; then $RECORDER --b25 --strip $CHANNEL $DURATION ${OUTPUT}_tmp.ts >/dev/null $PERL $ENCPROG ${OUTPUT}_tmp.ts ${OUTPUT} 480x360 <-解像度は4:3で指定(理由は後述) rm ${OUTPUT}_tmp.ts elif [ ${MODE} == 2 ]; then ・・・続く また、config.phpも$MODEにあわせて書き換えます。 $RECORD_MODE = array( // ※ 0は必須で、変更不可です。 0 => array( 'name' => 'Full TS', // モードの表示名 'suffix' => '.ts', // ファイル名のサフィックス ), 1 => array( 'name' => 'MPEG4 640x360', 'suffix' => '.mp4', ), 2 => array( ・・・続く また、tsencode.pl内の変数$cmdと$ffpresetも個々の環境にあわせて変更する必要があります。 地デジ用の画像サイズとアスペクト比の指定 †地デジはフルHDサイズで視聴されますが、放送データ自体の画像サイズは1440x1080のデータで、それをテレビ内部で1920x1080に引き延ばして映しています。
条件(1)と(2)、条件(3)と(4)はそれぞれ同じ画像サイズのファイルが出来上がりますが、画像サイズは生TSと同じ比にして、aspectで16:9に指定した方がファイルサイズが小さく、エンコードも1〜3割速いことがわかりました。 音ズレ対策 †上記コマンドでは、エンコードに成功はするものの、音声が映像よりコンマ数秒遅れます。視聴していても気になる程なので、改善が必要です。 $ 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 [出力ファイル] 参照元URL †がべこれログ - Garbage Collection Logffmpegエンコード設定について詳しく解説 コメント欄 †最新の10件を表示しています。 コメントページを参照 |