2014-10-27 89 views
3

做什麼,我有這樣的管道:隊列元素GStreamer的管道

gst-launch -v filesrc location=video.mkv ! matroskademux name=d \ 
d. ! queue ! ffdec_h264 ! subtitleoverlay name=overlay ! ffmpegcolorspace ! x264enc ! mux. \ 
d. ! queue ! aacparse ! mux. \ 
filesrc location=fr.srt ! subparse ! overlay. \ 
matroskamux name=mux ! filesink location=vid.mkv 

我試圖字幕刻錄成視頻。我已經succdeded讀取與字幕,但上面的管道卡住的文件,我有這樣的消息:

queue_dataflow gstqueue.c:1243:gst_queue_loop:<queue0> queue is empty 

這有什麼錯我的管道?隊列元素的作用是什麼?我還沒有真正理解它在文檔中的意思。

回答

6

隊列元素將線程邊界添加到管道並支持緩衝。輸入端會將緩衝區放入隊列中,然後在另一個線程的輸出端清空隊列。通過隊列元素的屬性,你可以設置隊列的大小和其他一些東西。

我沒有看到你的管道有什麼特別的問題,但是那裏的消息告訴你在某個點上有一個隊列是空的。這可能是一個問題或不是。稍後它可能會變得更加飽滿。

您必須檢查GStreamer調試日誌以查看是否有任何內容暗示實際問題。我最好猜測的是,由於x264enc的編碼器延遲,音頻隊列會運行完整。嘗試使音頻隊列變大,或在x264enc上設置tune = zerolatency。

另外我看到你正在使用GStreamer 0.10。它已經超過兩年不再維護,對於新的應用程序,您應該考慮升級到1.x版本。

+0

謝謝,這是否意味着「隊列」後面的所有內容都在新線程中運行?我認爲這意味着不要過度「排隊」? – 2016-09-24 12:57:54

0

隊列是可以通過其強制使用線程的線程邊界元素。它通過使用全球大學的線程課程中學習的經典提供者/消費者模型來實現。通過這樣做,它既可以作爲使線程間線程安全的數據吞吐量的手段,也可以充當緩衝區。隊列有幾個GObject屬性要配置用於特定用途。例如,您可以設置元素的上限和下限。如果數據少於下限(默認值:禁用),則會阻止輸出。如果數據超過上限閾值,則會阻止輸入或(如果配置爲這樣)丟棄數據。要使用一個隊列(並因此強制使用流水線中的兩個不同的線程),可以簡單地創建一個「隊列」元素,並將其作爲流水線的一部分。 GStreamer將在內部處理所有線程細節。