gstreamerコンパイルの話
前回示したスクリプトでは動かなかった所があったので、修正しました(修正後のスクリプトは前の記事を参照してください)。
主な変更点はソースをgitではなくtar.xzで固められたものを持ってくるようにしたことです。
バージョンは現在stableな1.2.2をチョイス。
後はたまたまエゴサーチしたら、前回の記事に対して以下の様な意見がありました。
なんでLD_LIBRARY_PATHを使うんですかね… | Raspberry Piで最新のgst-omxをコンパイルして動画を変換してみた - Toshifumi Nishinagaの技術めも http://t.co/vPSl2984sj
— NONAKA Kimihiro (@nonakap) May 12, 2014
LD_LIBRARY_PATHを使った場合の問題についてはよくわからないですが、使わないように修正してみました。
./configureにLIBSで指定するようにしただけです。
とりあえずこれでコンパイルできるはずです。
オーバークロックしてないRasPiなら、半日ぐらいで終わるはず。。。
BD画質動画エンコードのはなし
「でかいファイルも大丈夫だろうか」と気になって、Full HD(BD)画質の、6分間で2GB超えの動画ファイル作って、エンコードしようとしてました。
動画の詳細はこんな感じ。
$ ffprobe hoge.m2ts avprobe version 0.8.10-6:0.8.10-1+rpi1, Copyright (c) 2007-2013 the Libav developers built on Mar 22 2014 02:13:15 with gcc 4.6.3 Input #0, mpegts, from 'hoge.m2ts': Duration: 00:06:22.34, start: 4221.958300, bitrate: 42185 kb/s Program 1 Stream #0.0[0x1011]: Video: h264 (High), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc Stream #0.1[0x1100]: Audio: pcm_bluray, 48000 Hz, stereo, s32, 2304 kb/s
1日奮闘したけど、結局以下のコマンドで動画しか変換できなかった。
エンコード時間は12分。やっぱり速い。
gst-launch-1.0 filesrc location=hoge.m2ts ! progressreport ! tsdemux ! \ h264parse ! omxh264dec ! videoconvert ! \ omxh264enc target-bitrate=5500000 control-rate=variable periodicty-idr=30 ! \ video/x-h264,stream-format=byte-stream, profile=high ! \ h264parse ! mp4mux name=mux ! filesink location=hoge.mp4
音声の方は、このpcm_blurayというコーディックを、gstreamerが認識できず、デコードもできないので、現状どうしようもないっぽい。
$ gst-discoverer-1.0 hoge.m2ts Analyzing file:///mnt/fat/hoge.m2ts Done discovering file:///mnt/fat/hoge.m2ts Missing plugins Topology: container: MPEG-2 Transport Stream audio: audio/x-private-ts-lpcm video: H.264 Properties: Duration: 0:06:21.627008222 Seekable: yes Tags: video codec: H.264
音声の方はffmpegでは変換できたので、音声と動画別々に変換して、後でまとめるのが良さそうです。
# 下準備 sudo aptitude -y install ffmpeg gpac # 変換 gst-launch-1.0 filesrc location=hoge.m2ts ! progressreport ! tsdemux ! \ h264parse ! omxh264dec ! videoconvert ! \ omxh264enc target-bitrate=5500000 control-rate=variable periodicty-idr=20 ! \ video/x-h264,stream-format=byte-stream, profile=high ! \ h264parse ! mp4mux name=mux ! filesink location=hoge_mov.mp4 ffmpeg -i hoge.m2ts -vn -acodec aac -strict experimental -ac 2 -ar 48000 -ab 196k hoge.aac MP4Box -add hoge_mov.mp4 -add hoge.aac -new hoge.mp4
動画の質の件
動画のフレームが抜けたり、微妙にカクつく件については未解決……。
I,P,Bフレームとか、IDRフレーム間隔をいじったらなんとか出来るかと思ったけど、IDRフレーム間隔以外は設定すると変換自体が走らなくなる。
「可変フレームレートにしてるのに問題があるかも」と指摘を受けてcontrol-rate=constant
としてみたけど、これも変換が走らなくなった。
結構、謎なオプションが多い。
カクつく問題は、ソフトエンコの時には現れないことも分かった。
つまりハードエンコ特有の問題らしい。
変換が早すぎて、IOが追い付いていないから…とかそんな理由だろうか…それなら読み込みバッファを増やせば解決できる気がする。
ライセンスの話
H.264ハードウェアエンコードは、mpeg2デコードのライセンスを登録しないと、できないかもしれない。
ライセンスのないRasPiで変換しようとしたら、以下の様なエラーが出てできなかった。
Pipeline is PREROLLING ... ERROR: from element /GstPipeline:pipeline0/GstOMXH264Enc-omxh264enc:omxh264enc-omxh264enc0: GStreamer error: negotiation problem. Additional debug info: gstvideoencoder.c(1366): gst_video_encoder_chain (): /GstPipeline:pipeline0/GstOMXH264Enc-omxh264enc:omxh264enc-omxh264enc0: encoder not initialized ERROR: pipeline doesn't want to preroll. Setting pipeline to NULL ... Freeing pipeline ...
参考: http://www.raspberrypi.org/new-video-features-mpeg-2-and-vc-1-decode-h-264-encode-cec-support/
debianでexfatをマウントする方法
でかい動画はSDカードに入れるには酷だったので、USB-HDDに入れてRasPiに食わせた。
USB-HDDのファイルフォーマットはWinでもMacでも使えるようにexFatにしていたのだけど、linux(debian)でマウントするには以下のパッケージを入れる必要があった。
$ sudo aptitude -y install exfat-fuse
後は以下のようにマウントする。
$ sudo mount -t exfat-fuse /dev/sda3 /mnt/fat/