我需要并排合并两个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试了一下,卡在上面描述的地方。
你试过用gstreamer 1.0吗? 0.10不再被维护。管道应该是一样的。只需用videoconvert替换ffmpegcolorspace,用decodebin替换decodebin2,用videomixer替换videomixer2。你也需要使用新的pygi绑定来代替python gst模块。这可以给你一些提示:https://wiki.ubuntu.com/Novacut/GStreamer1.0 – thiagoss
我使用gstreamer 0.10,我会尝试那些步骤 –
由于某些原因我无法更改版本,我必须保持现在的0.10。 –