簡體   English   中英

Gstreamer在EOS之前動態更改源

[英]Gstreamer dynamically change source before EOS

我正在嘗試使用GStreamer 1.8.2和Python 3.5創建一個動態管道。 目的是能夠播放一些視頻並在EOS上對其進行更改,以類似於使用即將完成的播放器的方式實現無縫播放。

我的想法是filesrc-> encodebin->隊列-> videosink,然后將一個探測器放在解碼bin視頻src上,等待EOS事件,取消鏈接f​​ilesrc和encodebin,創建一個新的filesrc和一個新的definebin廣告,將它們設置后鏈接到視頻接收器他們進入PLAYING狀態。 我不知道這是否是最佳/正確的方法,但據我所知它應該有效。

我的第一次嘗試是這樣 播放在第一個循環中效果很好,然后視頻開始播放得太快。 我認為時間戳和/或流水線時鍾存在一些問題,但是我無法找到解決方案或更好地診斷問題。

編輯:在vaapisink中將max-lateness設置為-1,其回放速度仍然更快,但速度卻慢得多。 因此,這是一個時間問題。

好吧,我能告訴您-使用concat或videomixer / audiomixer(我更喜歡concat方式)..您不需要任何自定義解決方案:)

Concat確實可以按照您希望的方式在當前源的EOS上切換到另一個源。 是一個很好的示例。

如果要處理多個流(音頻,視頻,字幕等),則比較棘手,那么您需要合並流同步器或類似此處所述的內容。

還檢查此答案 ,已經有關於concat的示例了。但是也請閱讀注釋。

更新以手動方式進行:

使用videomixer和audiomixer有點棘手。

讓我們考慮視頻部分。

您將為要播放的流(第一個)創建bin-假設您在那里有uridecodebin,它將預滾動整個內容並創建pads ..當您發現新的pads是video / x-raw時,您將添加將探頭墊在那里,然后插入Videomixer。

然后一段時間(如果可能的話),您將使用另一個uridecodebin創建另一個bin(因此這是您的假設播放列表中的第二個“音軌”),並再次對此進行預滾動。 當您獲得打擊墊時,您無需將其連接至Videomixer而是將整個物體擋住(我認為PAUSED足夠合適)

當第一個進入EOS時,您將啟用第二個,而在第一個中,您將刷新視頻的其余部分。

當然,您將對音頻做同樣的事情。

現在最棘手的部分-您必須將視頻與音頻對齊(音頻的大小更大,您需要比較時間戳,直到音頻與視頻匹配,然后丟棄其余的音頻等等)-為了避免這種情況,這是必需的不同步。

這種方法很難做到。我曾經做過一次,我們在音頻和視頻同步方面存在無限的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM