2014年11月26日水曜日

Raspberry pi でMpeg2→Mpeg4へトランスコードする

RaspberryPiでハードウェアエンコードも可能だという事がわかったので、さっそくやってみることにした。


Step1.必要なファイルをインストールする

$ sudo sh -c "echo 'deb http://vontaene.de/raspbian-updates/ . main' >> /etc/apt/sources.list"
$ gpg --recv-keys 0C667A3E
$ gpg -a --export 0C667A3E | sudo apt-key add -
$ sudo aptitude update

$ apt-get install libgstreamer1.0-0 libgstreamer1.0-0-dbg libgstreamer1.0-dev liborc-0.4-0 liborc-0.4-0-dbg liborc-0.4-dev liborc-0.4-doc gir1.2-gst-plugins-base-1.0 gir1.2-gstreamer-1.0 gstreamer1.0-alsa gstreamer1.0-doc gstreamer1.0-omx gstreamer1.0-plugins-bad gstreamer1.0-plugins-bad-dbg gstreamer1.0-plugins-bad-doc gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-base-dbg gstreamer1.0-plugins-base-doc gstreamer1.0-plugins-good gstreamer1.0-plugins-good-dbg gstreamer1.0-plugins-good-doc gstreamer1.0-plugins-ugly gstreamer1.0-plugins-ugly-dbg gstreamer1.0-plugins-ugly-doc gstreamer1.0-pulseaudio gstreamer1.0-tools gstreamer1.0-x libgstreamer-plugins-bad1.0-0 libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-dev
$ gst-inspect-1.0 | grep omx
omx: omxmpeg2videodec: OpenMAX MPEG2 Video Decoder
omx: omxmpeg4videodec: OpenMAX MPEG4 Video Decoder
omx: omxh263dec: OpenMAX H.263 Video Decoder
omx: omxh264dec: OpenMAX H.264 Video Decoder
omx: omxtheoradec: OpenMAX Theora Video Decoder
omx: omxvp8dec: OpenMAX VP8 Video Decoder
omx: omxmjpegdec: OpenMAX MJPEG Video Decoder
omx: omxvc1dec: OpenMAX WMV Video Decoder
omx: omxh264enc: OpenMAX H.264 Video Encoder
pi@raspberrypi ~/gstreamer-1.0 $ gst-inspect-1.0 | grep fbdevsink
fbdevsink: fbdevsink: fbdev video sink



Step2.MPEG2のライセンスキーの購入
http://www.raspberrypi.com/mpeg-2-license-key/


Step3.ハードウェアエンコード
 ネット上より参考に見つけたやり方。
gst-launch-1.0 \
filesrc location=daitosho_PV.mpg  ! progressreport ! mpegpsdemux name=demuxer demuxer. ! queue ! \
mpegaudioparse ! mad ! audioresample ! audioconvert dithering=0 ! voaacenc bitrate=196000 ! mux. \
mp4mux  name=mux ! filesink location=hoge.mp4 demuxer. ! queue ! \
mpegvideoparse ! omxmpeg2videodec ! videoconvert ! \
omxh264enc target-bitrate=6000000 control-rate=variable ! video/x-h264,stream-format=byte-stream,profile=high ! \
h264parse ! mux.


これをやればうまく行くんだろうけど、目的は容量削減ではなく、
chromebookがMpeg2の再生に対応していないので、再生できるようにMpeg4へトランスコードすることである。
それとせっかくのRaspberryPiがハードウェアエンコードとデコードが使えるので、これらを使えるようにする。

やり方
1.TSファイルから必要な情報のみ取り出す。
  (これだけで、90%くらいに縮む。 21MB→19MB)
 $ tssplitter_lite src.ts dst.ts -1  (SIDはTS毎異なる)

2.TSファイルを分割する。(MPEG2動画とAAC音声に分ける)
 $ ffmpeg -y -i dst.ts -acodec copy dst.aac -vcodec copy -an dst.m2v

3.動画をMPEG2→MPEG4に変換する。
 $ gst-launch-1.0 filesrc location=a.m2v ! mpegvideoparse ! omxmpeg2videodec ! videoconvert ! omxh264enc ! filesink location=test.mp4

4.MPEG4とAACファイルをそのまま結合する。
 $ ffmpeg -i out.mp4 -i a.aac -vcodec copy -acodec copy output.mp4
 (最終結果で2.3MB、おおよそ10分の1)

これでMpeg4ファイルが完成してとてもコンパクトになったが、
インターレースの格子がひどいのでStep3は見直しが必要である。






○TSファイルから必要なデータのみ抽出
 wget http://hp.vector.co.jp/authors/VA038175/download/tssplitter_lite.zip
unzip tssplitter_lite.zip
cd tssplitter_lite
make all
cd tssplitter_lite
sudo cp tssplitter_lite /usr/local/bin/

使い方:tssplitter_lite source.ts dest.ts [SID]

 SIDの調べ方は、
  ffmpeg -i source.ts
 を実行して、Mepg2Videoになっている一番上にある番号が使うSID(1056など)



参考URL

http://theiopage.blogspot.jp/2013/04/enabling-hardware-h264-encoding-with.html

コメントを投稿

Androider