2017-05-12 40 views
0

ファイルがあります(おそらく、それは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_h264videorateの間です - 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のバッファ)にタイムスタンプを強制する(好ましくは、既存の要素を持つ)いくつかの方法がありますか?

答えて

0

Technicaly、これは答えではありません。元のh264ストリーム が失われているからです。

それは醜いハックですが、私がビデオを必要とし、これは私に私 はややOK品質で使用することができます何かを与えた:

fn="$1" 

mkdir images 

gst-launch-1.0 filesrc location=$fn ! h264parse ! avdec_h264 \ 
    ! videoconvert ! jpegenc \ 
    ! multifilesink location=images/img%06d.jpg 

gst-launch-1.0 multifilesrc location=images/img%06d.jpg \ 
    caps="image/jpeg,framerate=25/1,pixel-aspect-ratio=1/1" \ 
    ! jpegdec ! videoconvert ! video/x-raw \ 
    ! x264enc rc-lookahead=5 pass=quant quantizer=20 \ 
    ! avimux ! filesink location=${fn}.avi 

rm -rf images 
関連する問題