2017-02-13 21 views
1

我想拍攝一個視頻文件並覆蓋淡入和淡出的字幕。如何動態修改videomixer水槽墊alpha值

我剛開始學習如何使用Gstreamer。

到目前爲止,我已經成功地把一個流水線composits由textrender元素繪製到與videomixer元素的原始視頻流的字幕流。不幸的是,textrender和它的姐妹元素textoverlay沒有淡入/淡出功能。

該videomixer水槽墊有一個alpha屬性。現在,我已將名爲videomixer.sink_1的pad的alpha值設置爲1.0。下面是管道的命令行版本:

#!/bin/bash 

gst-launch-1.0 \ 
    filesrc location=sample_videos/my-video.mp4 ! decodebin ! mixer.sink_0 \ 
    filesrc location=subtitles.srt ! subparse ! textrender ! mixer.sink_1 \ 
    videomixer name=mixer sink_0::zorder=2 sink_1::zorder=3 sink_1::ypos=-25 sink_1::alpha=1 \ 
     ! video/x-raw, height=540 \ 
     ! videoconvert ! autovideosink 

我正在尋找一種方式來動態地修改alpha值隨着時間的推移,這樣我可以在適當的時候做出字幕組件淡入和淡出。 (我將分別解析SRT文件以確定淡入淡出開始和結束的時間。)

我正在學習GstBin C API(我的實際代碼是Python)。我想在我用Gst.parse_launch()創建管道後,我可以用gst_get_bin_by_name()來獲取任何指定的元素,然後使用該值訪問pad_1「sink_1」。

一旦我已經得到那麼多,我將能夠從接收計時器事件的事件處理程序中動態修改該alpha值嗎?視頻混合器元件是否會立即響應該鍵盤屬性的變化?有沒有其他人做到這一點?

我在這裏找到了部分答案:https://stackoverflow.com/a/17331845/270511但他們不告訴我這是否會在管道運行後起作用。

回答

1

是的,它會工作

該videomixer墊動態響應變化;我已經完成了alpha和position屬性。該墊的屬性可以改變使用

g_object_set (mix_sink_pad, "alpha", 0.5, NULL); 

我使用C,但您的Python策略訪問箱和墊的聲音正確。我的gstreamer代碼根據來自udp套接字的輸入做出響應,但是計時器事件可以很好地工作。例如,如果你想改變alpha值每100ms,你可以做這樣的事情

g_timeout_add_seconds (100, alpha_changer_cb, loop); 

然後,您可以在回調中使用g_object_set改變alpha屬性;它會動態更新並且看起來非常流暢。

+0

太棒了。謝謝。我想知道是否有更有效的方法來完成這個沒有回調。該網站的每位訪問者都將查看相同的視頻和配樂,但應該看到該訪問者獨有的自定義字幕。然而,字幕的時間從不變化,所以漸變效果應該總是在相同的地方發生。可能有一種方法可以實現這一點,第三個軌道控制字幕的不透明度,而不影響原始視頻(底層)?我應該開始一個新的問題嗎? –

+1

我不是專家,但肯定有更有效的方法來做到這一點,沒有回調;我的gstreamer的大部分體驗都是帶有實時視頻,所以我對時間事件不太熟悉。第三首曲目聽起來像是正確的想法,你當然可以控制第三首曲目而不會影響原始圖層。您可能已經熟悉它了,但gstreamer應用程序手冊非常有用,並且有一些非常好的示例:https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf也許檢查一下項目以及https://github.com/voc/voctomix –