/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

今日の進捗

gstreamerコンパイルの話

前回示したスクリプトでは動かなかった所があったので、修正しました(修正後のスクリプト前の記事を参照してください)。

主な変更点はソースをgitではなくtar.xzで固められたものを持ってくるようにしたことです。

バージョンは現在stableな1.2.2をチョイス。

後はたまたまエゴサーチしたら、前回の記事に対して以下の様な意見がありました。

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/

debianexfatをマウントする方法

でかい動画はSDカードに入れるには酷だったので、USB-HDDに入れてRasPiに食わせた。

USB-HDDのファイルフォーマットはWinでもMacでも使えるようにexFatにしていたのだけど、linuxdebian)でマウントするには以下のパッケージを入れる必要があった。

$ sudo aptitude -y install exfat-fuse

後は以下のようにマウントする。

$ sudo mount -t exfat-fuse /dev/sda3 /mnt/fat/