ファイルがあります(おそらく、それはmplayer -identify
と言われています)H264-ESストリームです。H264-ESビデオストリームにタイムスタンプを追加する
それは、gstreamer
パイプライン以下の使用して再生することができます。
gst-launch-1.0 filesrc location=vid.H264 ! h264parse ! avdec_h264 ! autovideosink
(私は例のautovideosink
を使用していますが、パイプラインがはるかに複雑である - これは、「最小限の作業例」である) 、それは非常に高速果たしていますおそらく私のCPUが許す限り速いでしょう。ストリームがフレームレート0/1
を持つため、タイムスタンプを必要とする要素を使用すると失敗します。
ストリームにはフレームレート情報がまったく含まれていないと思います。
参照:
$ mplayer -identify vid.H264 2>&1 | grep -i fps
FPS not specified in the header or invalid, use the -fps option.
ID_VIDEO_FPS=0.000
私は(のは、それが25fpsのだとしましょう)正しいフレームレートがどうあるべきかを知っている、と私は正しい設定ビデオフレームまたはに入れ、正しいタイムスタンプにできるようにしたいのですがストリームフレームレート。
私はこのためにvideorate
を使用することができることを考えた:: - 固定フレームレートに着信ストリームを変換しようとするvideorate
、それが時にはそれのように見える
gst-launch-1.0 filesrc location=vid.H264 ! h264parse ! avdec_h264 \
! videorate ! video/x-raw,framerate=25/1 ! autovideosink
が、私が間違っていた私が試した何
私が望むように動作しますが、下流の要素にわずかな遅延があっても、フリーズフレームのビデオ(多くの複製フレーム)が生成されるため、drop-only=true
オプションを使用できると思っていましたが、全く動作しません。
$ GST_DEBUG=3 gst-launch-1.0 filesrc location=vid.H264 ! h264parse ! avdec_h264 \
! videorate drop-only=true ! video/x-raw,framerate=25/1 ! autovideosink
Setting pipeline to PAUSED ...
0:00:00.030550249 31831 0x2094e10 WARN basesrc gstbasesrc.c:3470:gst_base_src_start_complete:<filesrc0> pad not activated yet
Pipeline is PREROLLING ...
0:00:00.044233138 31831 0x207d450 WARN libav gstavcodecmap.c:2408:gst_ffmpeg_caps_to_pixfmt: ignoring insane framerate 1/0
0:00:00.045314795 31831 0x207d450 WARN GST_PADS gstpad.c:3742:gst_pad_peer_query:<avdec_h264-0:src> could not send sticky events
0:00:00.070760684 31831 0x207d450 WARN baseparse gstbaseparse.c:3262:gst_base_parse_loop:<h264parse0> error: streaming stopped, reason not-negotiated
ERROR: from element /GstPipeline:pipeline0/GstH264Parse:h264parse0: GStreamer encountered a general stream error.
Additional debug info:
gstbaseparse.c(3262): gst_base_parse_loop(): /GstPipeline:pipeline0/GstH264Parse:h264parse0:
streaming stopped, reason not-negotiated
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...
Freeing pipeline ...
問題はavdec_h264
とvideorate
の間です - framerate=0/1
キャップを受け付けません。私は、私は必要だと思う何
は、(架空のパイプライン)のようなものです:
$ GST_DEBUG=3 gst-launch-1.0 filesrc location=vid.H264 ! h264parse ! avdec_h264 \
! force_timestamps framerate=25/1 ! autovideosink
私はforce_timestamps
要素を自分で記述する必要があります怖いが、私は前にいくつかの要素を記述しなかったので、それは一つでした私が今までにやった中で最も難しくて不愉快なことのうち、できるだけ既存の要素を使う方が大事です。
だから私の質問はこれです:
は、いくつかの固定されたフレームレートでビデオフレーム(またはGStreamerのバッファ)にタイムスタンプを強制する(好ましくは、既存の要素を持つ)いくつかの方法がありますか?