2009-07-21 37 views
4

我想編寫一個簡單的Linux CLI應用程序,它可以使用2個視頻源(1個演講者在講話,1個在他們的幻燈片並且沒有音頻)併合並它們。我可以使用Gstreamer API合併2個視頻嗎?

我希望整個輸出視頻是兩個原始視頻並排放置。否則,我的第二個最佳選擇將是一個「畫中畫」風格的視頻,主持人在角落裏的一個小框架。

從幾個小時的研究,GStreamer看起來像它可能能夠做到這一點。任何人都可以在我花更多時間嘗試之前進行確認嗎?

如果不行,還有其他API可以使用嗎?

回答

5

事實證明,gstreamer可以合併兩個視頻,使用videomixer濾鏡將它們並排放置在輸出視頻中。

一個基本的管道,它有兩個輸入文件,擴展他們是相同的大小,然後將它們合併,並對其進行編碼成Theora視頻可能是這樣的:

filesrc -> decodebin -> ffmpegcolourspace -> videoscale -> videobox -> videorate 
                        \ 
filesrc -> decodebin -> ffmpegcolourspace -> videoscale -> videorate -> videomixer -> ffmpegcolourspace -> theoraenc -> oggmux -> filesink 

你如何實現這個管道取決於語言。我用Ruby綁定原型,並且它工作得很好。

+0

我目前正在檢查GStreamer是否有類似的應用程序。這似乎是一個很好的解決方案。你用C或Ruby編寫了最終的應用程序嗎? – StackedCrooked 2009-11-10 23:24:58

+0

我最終在C中編寫應用程序。基本gstreamer應用程序確實需要很少的C,而ruby綁定缺少我需要的一些功能。 – 2009-11-11 09:26:25

0

AviSynth在我看來。我很多年前在Windows下使用過它,它擅長任意後期處理。 AviSynth v3應該在Linux下本地運行,但仍遠未準備就緒。不過,有些工具可以用Wine運行以前的版本。

0

MEncoder可以在linux上本地執行此操作。您可以分叉他們的代碼,或調用二進制文件。

9

下面是一個簡單的(工作)的設置使用GST-啓動(安裝GStreamer的工具包在Ubuntu/Debian的):

GST推出v4l2src設備=的/ dev /視頻1! videoscale! ffmpegcolorspace! video/x-raw-yuv,width = 640,height = 480! videobox border-alpha = 0 left = -640! videomixer name = mix! ffmpegcolorspace! xvimagesink v4l2src! videoscale! ffmpegcolorspace! video/x-raw-yuv,width = 640,height = 480! videobox right = -640!混合。

這基本上使用視頻4 linux 2(一個來自默認設備和另一個來自/ dev/video1的流)讀取兩個視頻。如果您的設置不同,您可能需要更改該設置。

第一部分(非粗體)負責從捕捉設備中讀取視頻,協商尺寸和色彩空間(videoscale!ffmpegcolorspace),強制特定的視頻格式(video/x-raw-yuv,width = 640,高度= 480),向左側添加640個透明像素(從而將圖像向右移動)並創建名稱爲「混合」的視頻混合器。最後它再次自動協商顏色空間並使用XVideo窗口顯示結果。

第二部分(以粗體顯示)讀取第二視頻流(從缺省捕獲裝置,添加設備=的/ dev/VideoX時來選擇不同的設備),則執行相同的色彩空間,大小協商和視頻格式選擇第一個流,然後將視頻向左移動640像素,並將結果提供給名爲mix(我們的視頻混合器)的元素。末尾的點是必需的,並指示gstreamer搜索名爲「mix」的現有元素,而不是查找過濾器。

你可以用v4l2src替換device =/dev/video1filesrc location = video.avi! decodebin以從視頻文件獲取輸入。

替換xvimagesinkjpegenc! avimux! filesink location = out.avi將結果寫入視頻文件。

相關問題