1

저는 파이썬에서 gstreamer & gnonlin을 사용하여 짧은 전환 (예 : smpte)을 사용하여 2 개의 비디오를 gstreamer와 결합하려고했습니다. 그러나 나는 gnloperation/smpte 전환 작업을 얻을 수 없습니다.GStreamer 및 GNonLin이있는 비디오 전환이 작동하지 않습니다.

목표

아래 프로그램은 다음과 같습니다. 한 파일의 처음 4 초를 재생하고 2 초에서 다른 파일로 smpte 전환 (2 초간 지속)을 시작하기를 원합니다. (따라서 두 번째 파일은 2 초를 시작하지만 2 초의 전환 과정에서 '공개'됩니다.) 전환이 끝나면 두 번째 파일의 2 초가 표시되어야합니다.

이것은 another gstreamer/gnonlin script in python을 기반으로합니다. 나는이 질문을 the gstreamer-devel list (그리고 again)에 묻었고, 여기에서 시험하고있다.

문제

전환이 완료되지 않습니다. 전환이 약 0.5 초 동안 실행 된 후 비디오 1이 약 1.5 초 동안 재생 된 다음 비디오 2가 끊깁니다. 컨트롤러의 끝 위치를 변경하려고 시도했습니다 (예 : controller.set("position", 0.5 * gst.SECOND, 0.0)). 전환이 0.5 초 내에 완료됩니다. 전환이 완료되면 동영상 1이 조금 더 재생되기 시작하고 동영상 2가 재생되기 시작합니다.

비디오 전환이 0.5 초로 제한되었다고 생각하면서 전환을 0.5 초로 변경했지만 전환이 약 0.3 초 ​​동안 만 재생된다는 점을 제외하면 동일한 비 마무리 문제가 지속됩니다. 동영상 1이 조금씩 시작되고 동영상 2가 재생됩니다.

스크립트

#! /usr/bin/python 
import gst, gobject 
gobject.threads_init() 

comp = gst.element_factory_make("gnlcomposition", "composition") 

gsrc1 = gst.element_factory_make("gnlfilesource") 
gsrc1.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort01.mov" 
gsrc1.props.start   = 0 
gsrc1.props.duration  = 4 * gst.SECOND 
gsrc1.props.media_start = 0 
gsrc1.props.media_duration = 4 * gst.SECOND 
gsrc1.props.priority  = 3 
comp.add(gsrc1) 


gsrc2 = gst.element_factory_make("gnlfilesource") 
gsrc2.props.location = "file:///home/rory/helmetcam/dingle-tom/vshort02.mov" 
gsrc2.props.start   = 2 * gst.SECOND 
gsrc2.props.duration  = 6 * gst.SECOND 
gsrc2.props.media_start = 0 
gsrc2.props.media_duration = 2 * gst.SECOND 
gsrc2.props.priority  = 2 
comp.add(gsrc2) 


bin = gst.Bin() 
alpha1 = gst.element_factory_make("alpha") 
queue = gst.element_factory_make("queue") 
smpte = gst.element_factory_make("smptealpha") 
smpte.props.type = 21 
mixer = gst.element_factory_make("videomixer") 

bin.add(alpha1, queue, smpte, mixer) 
alpha1.link(mixer) 
queue.link(smpte) 
smpte.link(mixer) 

controller = gst.Controller(smpte, "position") 
controller.set_interpolation_mode("position", gst.INTERPOLATE_LINEAR) 
controller.set("position", 0, 1.0) 
controller.set("position", 2.0 * gst.SECOND, 0.0) 

bin.add_pad(gst.GhostPad("sink1", alpha1.get_pad("sink"))) 
bin.add_pad(gst.GhostPad("sink2", queue.get_pad("sink"))) 
bin.add_pad(gst.GhostPad("src", mixer.get_pad("src"))) 

op = gst.element_factory_make("gnloperation") 
op.add(bin) 
op.props.start   = 2 * gst.SECOND 
op.props.duration  = 2 * gst.SECOND 
op.props.media_start = 0 
op.props.media_duration = 2 * gst.SECOND 
op.props.priority  = 1 
comp.add(op) 

# create the backend 
color= gst.element_factory_make("ffmpegcolorspace") 
enc = gst.element_factory_make("theoraenc") 
mux = gst.element_factory_make("oggmux") 
sink = gst.element_factory_make("filesink") 
sink.props.location = "./transitions-between-two.ogv" 
pipeline = gst.Pipeline() 
pipeline.add(comp, color, enc, mux, sink) 
color.link(enc) 
enc.link(mux) 
mux.link(sink) 

def on_pad(comp, pad, elements): 
    convpad = elements.get_compatible_pad(pad, pad.get_caps()) 
    pad.link(convpad) 
comp.connect("pad-added", on_pad, color) 

# now run the pipeline 
loop = gobject.MainLoop(is_running=True) 
bus = pipeline.get_bus() 
bus.add_signal_watch() 
def on_message(bus, message, loop): 
    if message.type == gst.MESSAGE_EOS: 
     loop.quit() 
    elif message.type == gst.MESSAGE_ERROR: 
     print message 
     loop.quit() 
bus.connect("message", on_message, loop) 
pipeline.set_state(gst.STATE_PLAYING) 
loop.run() 
pipeline.set_state(gst.STATE_NULL) 
+0

전환을 짧게하지 않고 더 길게 만들면 같은 효과가 나타 납니까? – agf

답변

2

문제가 두 번째 소스 파일의 속성 인 것 같습니다. 대신에

는 :

gsrc2.props.start   = 2 * gst.SECOND 
gsrc2.props.duration  = 6 * gst.SECOND 
gsrc2.props.media_start = 0 
gsrc2.props.media_duration = 2 * gst.SECOND 
gsrc2.props.priority  = 2 

시도는 :

gsrc2.props.start   = 2 * gst.SECOND 
gsrc2.props.duration  = 4 * gst.SECOND 
gsrc2.props.media_start = 0 
gsrc2.props.media_duration = 4 * gst.SECOND 
gsrc2.props.priority  = 2 

이 나를 위해 예상대로 작동하는 것 같다.

관련 문제