TS から H.264 の MPEG4 にする

TS はファイルサイズが大きすぎるので、保存用に MPEG4 に圧縮したい。 Ubuntu 12.10 で圧縮の作業を行ったときのメモ。

TS のカットと音声・映像の分離

Linux にアプリケーションはほとんどないので wine で動かす。

TS のカットは Murdoc CutterHDTVtoMPEG2 が wine を使って Linux でも利用できる。 音ずれが起こるという情報もあるが、私の用途ではそこまでこだわらないので Murdoc Cutter を使用している。 カットは動画の前後をカットするだけで、途中の CM などはカットしなかった。 途中でカットをする場合は音ずれが発生するかもしれないので、そのような必要があるときには注意したい。

ワンセグなどの余計なデータを除くには TsSplitter が使用できる。 BonTSDemux を使えば映像と音声を分離できる。 ただ BonTSDemux はバージョンが新しい(改造バージョン?)と wine で動かなかった。 他にも、ts2aac (これも wine)で aac データを取り出せるし、 avidemux (Ubuntu のパッケージ)も映像と音声の分離に利用できる。

TS の圧縮

なにに圧縮するのが良いのか全然知らなかったのだが、最近では 映像は H.264 (MPEG-4 AVC ともいう)、音声は AAC にして mp4 にするのがデファクトスタンダードのようだ。 以下では、H.264 への圧縮は ffmpeg、音声は faac で圧縮する、 または TS から抜き出した AAC をそのまま使って mp4 にしている。

ffmpeg の使い方

映像の圧縮は x264 を使用するのが評判が良いようだ。 音声の AAC への圧縮は faac を使用している場合が多い (フリーでないし、他の商用のエンコーダの方が良いようだ)。 とりあえず、試しに ffmpeg を使って圧縮してみる。 libx264.ffpreset という名前のファイルに

coder=1
flags=+loop+ilme
cmp=+chroma
partitions=+parti8x8+parti4x4+partp8x8+partb8x8
me_method=umh
subq=8
me_range=16
g=250
keyint_min=25
sc_threshold=40
i_qfactor=0.71
b_strategy=2
qcomp=0.6
qmin=10
qmax=51
qdiff=4
bf=4
refs=4
directpred=3
trellis=1
flags2=+bpyramid+wpred+mixed_refs+dct8x8+fastpskip

を書き込む。preset の意味はよくわからないが、このページの一番下の参考のサイトから適当にコピーした。

ffmpeg -y -i input.ts -f mp4 -vcodec libx264 -fpre /path/to/preset/libx264.ffpreset -threads 0 -r 30000/1001 -deinterlace -b 2M -bt 2M -aspect 16:9 -vsync 1 -acodec libvo_aacenc -ac 2 -ar 48000 -ab 128k -map 0:0 -map 0:1 -s 1280x720 out.mp4

で圧縮できる。画質は高くはなく、サイズは 1280x720 に小さくしている。 libfaac を使いたかったのだが、Ubuntu のパッケージだと指定できなかったので libvo_aacenc を指定した。

ffmpeg のコンパイル

Ubuntu のパッケージだと libfaac を使用できない(おそらく faac のライセンスの関係でパッケージとして配布していない)。 libfaac を使用したいので ffmpeg をコンパイルする。

git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg

最新の ffmpeg がオプションが変更されていて使い方がわからないので、 Ubuntu 12.10 とおそらく等しい git のタグで n0.8.4 になっているバージョンを使うことにした。

git checkout n0.8.4
./configure --enable-gpl --enable-nonfree --enable-pthreads --disable-debug \
--disable-ffserver --disable-ffplay --enable-libschroedinger --enable-libdc1394 \
--enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libtheora \
--enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-bzlib \
--enable-version3 --enable-libspeex --enable-libvpx --enable-avfilter
make

でカレントディレクトリに ffmpeg ができるのでこれを実行すれば良い。

ffmpeg & avconv

Ubuntu 12.10 では ffmpeg を実行すると avconv の使用をすすめられる。 ffmpeg は Ubuntu では将来的に廃止されるようだ。 http://ja.wikipedia.org/wiki/FFmpeg に経緯が書いてあり、 「2011年3月13日に FFmpeg の開発は、開発体制の対立から ffmpeg.org と libav.org に分裂した。」 ためで、Ubuntu は libav.org の avconv を採用することにしたようだ。

字幕の取り出しと Unicode への置換

Caption2Ass を使えば字幕を取り出せる。srt 形式にする。 外字がある場合に必要となる Gaiji ディレクトリを Caption.dll と同じディレクトリに作成する。 wine で使うには

wine Caption2Ass.exe -format srt ~/path/to/input.ts

のようにファイルの指定をフルパス(~ を使っているので厳密にはフルパスではないが)でないとだめだった。 上の例だと input.ts と同じディレクトリに input.srt が作成される。

mp4 にするときに、字幕の外字の埋め込み方がよくわからない(そもそも無理?)ので、 外字は Unicode に変換しておく。 外字に携帯電話のマークが出力されていて Unicode 6 に携帯電話のマークがあるのだが (http://wiki.livedoor.jp/qvarie/d/%A5%E6%A5˥%B3%A1%BC%A5ɳ%A8ʸ%BB%FA%A4%C8ASTEL%B3%A8ʸ%BB%FA%C2о%C82)、 これは MP4Box で

Invalid UTF data (line 565) 

となってうまくいかなかった。 これは結局、適当な文字に置換した。

5.1ch オーディオの TS

ffmpeg version 0.8.4 だと途中で 5.1ch に切り替わる TS は変換できなかった。 Murdoc Cutter でカットすると音がずれた。単に音がずれたというより、 圧縮したときに映像か音声のどちらか(ひょっとしたら両方とも)の長さがおかしくなった。 とりあえず、(ほとんど見る機会はないので)圧縮できればよいとして、カットしないことにした。

手順は、BonTSDemux で音声(wave)と映像を分離してから、 映像の方は ffmpeg で x264 で圧縮する。オプション -an をつけると音声は無視される。

/path/to/ffmpeg -y -i input.ts -f mp4 -vcodec libx264 -fpre /path/to/libx264.ffpreset -threads 0 -r 30000/1001 -deinterlace -b 2M -bt 2M -aspect 16:9 -an -map 0:0 out.mp4

音声の方は取り出した wave を

ffmpeg -i input.wav out.aac

で aac に変換した。 wave は 48000Hz だったためなのか faac で変換するとうまくいかなかったので ffmpeg で変換した。 元は 5.1ch だったのだが BonTSDemux で分離するときに 2ch にした (5.1ch のままで MPEG4 にする方法がわからなかったので)。

圧縮した映像と音声を適当な -delay の値を指定して MP4Box で結合する。 Ubuntu 12.10 で MP4Box は gpac パッケージに入っている。

apt-get install gpac

でインストールする。

MP4Box -fps 29.97 -add out.mp4 -add out.aac -delay 1=-750 -new new.mp4

で映像と音声を結合してできた new.mp4 が作成されている。

二か国語 & 字幕 の TS を 圧縮する

murdoccutter でカットする。前後のカットだけなので途中でカットした場合はどうなるか不明 (きちんと字幕が取り出せるのかなど)。

avidemux で音声を2つ別々に保存する、または ts2aac を wine を使って動かす。

wine ts2aac.exe -i input.ts -D -Z -e 0 -o audio0
wine ts2aac.exe -i input.ts -D -Z -e 1 -o audio1

オプション -Z を与えた ts2aac で取り出すとディレイが0の aac になる (どこかで音ずれしているので、最後に再生してみて MP4Box の delay で調整した)。 取り出した aac ファイルは

faad -i audio.aac

として長さを確認する。

「字幕の取り出しと Unicode への置換」の方法で字幕ファイル(ここでは jimaku.srt)を取り出し、 「5.1ch オーディオの TS」と同様に ffmpeg で映像を圧縮する(ここでは out.mp4)。

これらを MP4Box で delay と lang を指定して結合する。

MP4Box -fps 29.97 -add out.mp4 \
-add audio0\ PID\ 0x110\ DELAY\ -416ms.aac:lang=jpn:delay=-416 \
-add audio1\ PID\ 0x111\ DELAY\ -416ms.aac:lang=eng:delay=-416 \
-add sample.srt:lang=jpn -new new.mp4

のようにはじめは実行したのだが delay (にマイナスの値?)を使うとできた mp4 の長さが約3倍になる。 delay を除いて

MP4Box -fps 29.97 -add out.mp4 \
-add audio0\ PID\ 0x110\ DELAY\ -416ms.aac:lang=jpn \
-add audio1\ PID\ 0x111\ DELAY\ -416ms.aac:lang=eng \
-add sample.srt:lang=jpn -new new.mp4

とすれば問題ない。

MP4Box の delay

MP4Box のオプションで

-add audio0.aac:lang=jpn:delay=300 \

のようにすると 300ms のディレイを設定できる。 このディレイは再生時に有効になるプレイヤーと無視するプレイヤーがあった。 ディレイを 5000ms に設定した動画を再生して調べたところ

  • Totem 動画プレイヤー 3.4.3 (GStreamer 0.10 を使用、Ubuntu 12.10 のパッケージ)

はディレイを無視していた。

  • VLC media player 2.1.0 (リポジトリからダウンロードしてコンパイル)
  • gnome-mplayer 1.0.6 (Ubuntu 12.10 のパッケージ)

delay の値の調整 (2016-05-08)

MP4Box で何度も mp4 を作って delay の値を調整するのは大変なので はじめに作成した mp4 を再生するときに delay を変えて値を調整する。 vlc の「–audio-desync」オプションで再生するときの delay を指定できる。

AAC の lossless 編集

mp3DirectCut で AAC を lossless でカットできる。 Windows のソフトだが、wine で動かすことができる。

参考

Tags of current page

,