2014-02-22 40 views
2

我需要並排合併兩個avi視頻,並使用python + gstreamer作爲以下代碼成功完成。以編程方式並排合併兩個視頻

pipe = """ 
videomixer2 name=mix background=1 
    sink_0::xpos=0 sink_0::ypos=60 sink_0::zorder=0 
    sink_1::xpos=640 sink_1::ypos=60 sink_1::zorder=0 ! 
ffmpegcolorspace name=colorsp_saida ! 
video/x-raw-yuv, format=(fourcc)I420, width=1280, height=480, framerate=25/1 ! 
x264enc quantizer=45 speed-preset=6 profile=1 ! queue ! 
mp4mux name=mux ! queue ! filesink location="output.mp4" 

filesrc location="video1.avi" ! decodebin2 name=dbvideo1 ! 
aspectratiocrop aspect-ratio=16/9 ! videoscale ! videorate ! 
ffmpegcolorspace name=colorsp_video1 ! 
video/x-raw-yuv, format=(fourcc)AYUV, framerate=25/1, width=640, height=360 ! 
mix.sink_0 

filesrc location="video2.avi" ! decodebin2 name=dbvideo2 ! 
aspectratiocrop aspect-ratio=16/9 ! videoscale ! videorate ! 
ffmpegcolorspace name=colorsp_video2 ! 
video/x-raw-yuv, format=(fourcc)AYUV, framerate=25/1, width=640, height=360 ! 
mix.sink_1 
""" 

import gst 
pipeline = gst.Pipeline() 
bus = pipeline.get_bus() 

gst_bin = gst.parse_bin_from_description(pipe, False) 
pipeline.add(gst_bin) 

pipeline.set_state(gst.STATE_PLAYING) 
msg = bus.timed_pop_filtered(gst.CLOCK_TIME_NONE, gst.MESSAGE_ERROR | gst.MESSAGE_EOS) 
pipeline.set_state(gst.STATE_NULL) 

我使用的是Ubuntu 12.04 LTS,python 2.7和gstreamer。

我有幾個問題如波紋管,

  • 當我使用更大的輸入文件(持續時間超過30分鐘)的方案是掛在lator階段,但它仍然給output.mp4。
  • 這是非常慢的,如果我轉換30分鐘,程序也運行20-25分鐘
  • 兩個輸入文件可能會有幾秒鐘(10-20秒)的時間差距,這會是問題嗎?

如果我有任何其他的方式來合併和轉換這個文件,除了gstreamer也可以接受。

UPDATE1:

後的作品幾天,我發現程序獲得的pipeline.set_state(gst.STATE_NULL)線掛起。任何人都有一個想法,如何克服這一點。

基本上我需要釋放管道的資源沒有任何問題。

UPDATE2:

我需要合併兩個視頻(AVI)文件(或文件將有一個音頻)並排轉換成MP4格式,這是問題的一個整體思路。我用gstreamer試了一下,卡在上面描述的地方。

+0

你試過用gstreamer 1.0嗎? 0.10不再被維護。管道應該是一樣的。只需用videoconvert替換ffmpegcolorspace,用decodebin替換decodebin2,用videomixer替換videomixer2。你也需要使用新的pygi綁定來代替python gst模塊。這可以給你一些提示:https://wiki.ubuntu.com/Novacut/GStreamer1.0 – thiagoss

+0

我使用gstreamer 0.10,我會嘗試那些步驟 –

+0

由於某些原因我無法更改版本,我必須保持現在的0.10。 –

回答

1

工作ffmpeg代碼,

./ffmpeg -i video1.avi -i video2.avi -r 30 -filter_complex "[0:v]scale=640:480, setpts=PTS-STARTPTS, pad=1280:720:0:120[left]; [1:v]scale=640:480, setpts=PTS-STARTPTS, pad=640:720:0:120[right]; [left][right]overlay=w; amerge,pan=stereo:c0<c0+c2:c1<c1+c3" -vcodec libx264 -acodec aac -strict experimental output.mp4 
相關問題