/home/tnishinaga/TechMEMO

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

今日の進捗

gstreamerで変換できないファイル

gstreamerで何故か上手く変換できない動画を、なんとか変換しようと頑張ってみた。

コンテナに突っ込むところでエラーが出ていたので、以下の様にmatroskaコンテナを使うようにしたら、作れた。

$ gst-launch-1.0 \
filesrc location=sakigake.mpg ! progressreport ! mpegpsdemux name=demuxer demuxer. ! queue ! \
mpegaudioparse ! mad ! audioresample ! audioconvert dithering=0 ! voaacenc bitrate=196000 ! mux. \
matroskamux  name=mux ! filesink location=hoge.mkv demuxer. ! queue ! \
mpegvideoparse ! omxmpeg2videodec ! videoconvert ! \
omxh264enc target-bitrate=6000000 control-rate=variable ! video/x-h264,stream-format=byte-stream,profile=high ! \
h264parse ! mux.

ただし、再生してみると以下のように一部フレームが欠落した部分が見つかった。

f:id:tnishinaga:20140508023730p:plain

変換の途中経過を見なおしてみると、以下の様な警告が出ていた。

** (gst-launch-1.0:4010): WARNING **: Too old frames, bug in decoder -- please file a bug

「フレームが古すぎる!デコーダのバグだ!」といってるので、多分これが原因なんだと思う。

gstreamerのomxプラグインを最新のものにすれば、改善するかもしれない。

なので現在、一度RasPiの環境をOSごと作り直して、gstreamerごとソースからコンパイルしなおしてみている。

上手く行ったら、また報告します。

gstreamerとPython連携の話

gstreamerでデコードした動画のデータを、パイプを使ってpythonに食わせることができないか、調べてました。

gstreamerからパイプに出力するときは、sinkデバイスにファイルディスクリプタsinkを指定すればいいらしい。

gst-launch-1.0 filesrc location=daitosho_PV.mpg ! mpegpsdemux ! mpegvideoparse ! omxmpeg2videodec ! fdsink

これをパイプしてpythonに食わせればいいのだけど、pythonで標準入力から、OpenCVにデータを渡す方法がわからず、ひとまずおいとくことにした。

多分以下のサイトの説明が、一番近いと思う。Processingだけど。

http://xuv.be/OpenCV-GStreamer-Camera-over-IP.html

そんな感じで。

おやすみなさい。