1

私は、gstreamer & gnonlinを使ってpythonで 短いトランジション(smpteなど)を持つgstreamerと2つのビデオを結合しようとしました。しかし、私はgnloperation/smpteの移行を動作させることはできません。GStreamerとGNonLinのビデオトランジションは動作しません

ゴール

以下はプログラムです。私はそれが1つのファイルの最初の4秒を再生し、2秒で別のファイルにsmpteトランジション(2秒間続く)を開始したい。 (2秒目のファイルは全部で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

問題はあなたの第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 

これは私のために期待どおりに動作するようです。

関連する問題