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.
ただし、再生してみると以下のように一部フレームが欠落した部分が見つかった。
変換の途中経過を見なおしてみると、以下の様な警告が出ていた。
** (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
そんな感じで。
おやすみなさい。