2017-08-25 89 views
0

我有一個類似於此的gstreamer管道。Gstreamer三通各分支具有不同功能

       Queue -> videoscale -> videosink 
          /
appsrc -> h264_decoder -> Tee 
          \ 
           Queue -> jpegenc -> multifilesink 

Tee如何處理解碼板上的功能?是否可以在兩個分支上設置不同的功能?

具體來說,是否可以設置兩種不同的幀率? Filesink以1 fps存儲,而videosink以30 fps顯示。

我正在使用以下命令行進行測試。

gst-launch-1.0 -e \ 
    filesrc location=${1} ! queue ! qtdemux name=d d.video_0 ! h264parse ! avdec_h264 ! tee name=t \ 
         t. ! queue ! videoscale ! 'video/x-raw,width=(int)960,height=(int)540' ! autovideosink \ 
         t. ! queue ! 'video/x-raw,framerate=1/1' ! jpegenc ! multifilesink location=out/img1_%03d.jpeg 

但是我得到'內部數據流錯誤'和'原因未鏈接'。

+0

如果你有一個解碼器,一組參數和其他的參數設置另一個解碼器 - 那麼你已經有了兩個解碼器,對不對?在appsrc之後放置tee並使用兩個h264_decoder。 – Velkan

+0

@Velkan我試圖做的是解碼一次,但從中獲得一個框架放入一個文件。所以我想在解碼器後面放一個tee,第一個分支只是將解碼的幀顯示爲普通的解碼顯示流水線,但第二個分支只會存儲其中一個幀。 – Ajith

回答

1

問題是你在你的管道的每個分支上要求不同的幀速率。

您忘記實例化一個元素,該元素爲您的錄製分支提供1/1的幀率。 videorate做那個工作。

這裏是工作的管道,我提議:

gst-launch-1.0 -e \ 
    filesrc location=${1} ! queue ! qtdemux name=d d.video_0 ! h264parse ! avdec_h264 ! tee name=t \ 
         t. ! queue ! videoscale ! 'video/x-raw,width=(int)960,height=(int)540' ! autovideosink \ 
         t. ! queue ! videorate ! 'video/x-raw,framerate=1/1' ! jpegenc ! multifilesink location=out/img1_%03d.jpeg 
+0

現在我明白了,該功能必須由某個元素處理,avdec_h264不處理這個問題。謝謝,這對我有用。 – Ajith