2016-08-11 57 views
0

當我有多個gstreamer進程同時運行時,我無法從appsrc保存到filesink。只有其中一個gstreamer進程會正確寫入,而其他進程會寫入幾乎空的文件。在文件鏈接操作期間似乎存在寫入爭用。無法從appsrc寫入多個同步文件鏈接

注意:我在MAC OS 10.11.6上使用gstreamer1.0(v1.8.2)和python3(v3.5.2)。

下面是我的代碼實際上這樣做的:

在後臺,我在從單個視頻流的幀讀取,每一幀轉換成大小1920x800x3的BGR numpy的陣列,並存儲在環形緩衝器中的每個幀。我已經構建了一個「gstreamer_writer函數」,用於從此循環緩衝區讀取幀,將這些幀轉換爲字節流,並將此流饋送到appsrc。

這可以通過實例化一個新的多進程(multiprocessing.Process)並將其指向「gstreamer_writer函數」來實現。這對單個多進程/函數調用來說是完全正常的。 Appsrc正確饋送的字節流和我保存這些BGR使用以下gstreamer的管道幀到一個MP4與H264編碼:

appsrc format=3 name=app emit-signals=true do-timestamp=true is-live=true blocksize=4608000 max-bytes=0 caps=video/x-raw,format=BGR,width=1920,height=800 ! videoconvert ! video/x-raw,format=I420,width=1920,height=800 ! vtenc_h264 ! mp4mux ! filesink location=test1.mp4 

然而,如果我實例的兩個或更多multiprocesses並在函數指向他們僅一個filesinks將正常工作。例如,如果一個人寫入「test1.mp4」,另一個寫入「test2.mp4」,則其中一個視頻將被正確寫入,另一個將失敗並寫入一個接近空的mp4(〜500kb)。它不總是相同的mp4,50%的時間test1.mp4被正確寫入,50%的時間test2.mp4被正確寫入。它看起來像是有某種競爭條件或寫爭用,阻止兩個mp4被正確寫入文件。

需要注意的一件事是,每個多進程都從相同的環形緩衝區訪問相同的幀。我認爲這可能導致gstreamer出現問題。但是,如果我使用autovideosink顯示流而不是將它們寫入文件,則可以顯示儘可能多的流/多進程。這意味着數據正在通過管道正確傳遞,並且在寫入階段只會失敗。我測試了這個使用GStreamer的命令:

appsrc format=3 name=app emit-signals=true do-timestamp=true is-live=true blocksize=4608000 max-bytes=0 caps=video/x-raw,format=BGR,width=1920,height=800 ! videoconvert ! video/x-raw,format=I420,width=1920,height=800 ! vtenc_h264 ! avdec_h264 ! autovideosink 

如果任何人有我如何可以解決此問題的任何建議,我將不勝感激。我希望這是一個簡單的改變,但你永遠不知道與gstreamer!

謝謝!

回答

0

太長評論,如果我是正確的這個可以解決你的問題..

文件接收之前加入隊列:使用元件之前 +做一個緩衝:

appsrc format=3 name=app emit-signals=true do-timestamp=true is-live=true blocksize=4608000 max-bytes=0 caps=video/x-raw,format=BGR,width=1920,height=800 ! videoconvert ! video/x-raw,format=I420,width=1920,height=800 ! queue ! vtenc_h264 ! mp4mux ! queue ! filesink location=test1.mp4 

隊列有兩個功能(哪個編碼器 - 它需要很多幀才能開始編碼) +將進一步處理分離到新線程中 - 以便filesink將在新線程中處理數據。

HTH

+0

感謝您的快速反應@otoplsky!不幸的是,增加這兩個隊列並不能解決問題。一個進程立即開始寫入文件,另一個進程停留在0MB。我確實收到了一個新的錯誤信息,它添加了僅在最開始時只觸發一次的隊列: 錯誤:GST_PADS gstpad.c:3279:gboolean gst_pad_query_latency_default(GstPad *,GstQuery *):最大延遲大於最大延遲。 我在啓動時也總是遇到以下錯誤: vtenc vtenc.c:807:gst_vtenc_create_session: VTCompressionSessionCreate()返回:-12915 –