2014-04-23 3 views
0

목표는 서로 다른 오디오 파일의 파트를 함께 편집하고 각 파트에 단일 타임 스트레치 효과 (Pitch 요소의 템포 속성)를 적용하는 것입니다. 각 세그먼트는 최종 믹스에서 12 초 동안 지속되어야하므로 출력 파일의 길이는 36 초입니다. 다음 코드에서는 3 개의 파일에 대해이 작업을 수행합니다 (루프를 사용하고 모든 것을 목록에 저장하여 확장 할 수 있음). [예, 길어요]템포 변경과 함께 GStreamer의 gnonlin 사용

import gst, gobject 
gobject.threads_init() 
import numpy as np 
import math 

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

gsrc1 = gst.element_factory_make("gnlfilesource") 
gsrc1.props.location = "file1.mp3" 
gsrc1.props.start   = 0 
gsrc1.props.duration  = ? 
gsrc1.props.media_start = 0 
gsrc1.props.priority  = 3 
comp.add(gsrc1) 

gsrc2 = gst.element_factory_make("gnlfilesource") 
gsrc2.props.location = "file2.mp3" 
gsrc2.props.start   = ? 
gsrc2.props.duration  = ? 
gsrc2.props.media_start = 0 
gsrc2.props.priority  = 4 
comp.add(gsrc2) 

gsrc3 = gst.element_factory_make("gnlfilesource") 
gsrc3.props.location = "file3.mp3" 
gsrc3.props.start   = ? 
gsrc3.props.duration  = ? 
gsrc3.props.media_start = 0 
gsrc3.props.priority  = 5 
comp.add(gsrc3) 

bin = gst.Bin() 
audioconvertbin = gst.element_factory_make("audioconvert") 
pitch1 = gst.element_factory_make("pitch") 
pitch1.set_property("tempo", 1.05) 
bin.add(audioconvertbin, pitch1) 
audioconvertbin.link(pitch1) 
bin.add_pad(gst.GhostPad("sink", audioconvertbin.get_pad("sink"))) 
bin.add_pad(gst.GhostPad("src", pitch1.get_pad("src"))) 

bin2 = gst.Bin() 
audioconvertbin2 = gst.element_factory_make("audioconvert") 
pitch2 = gst.element_factory_make("pitch") 
pitch2.set_property("tempo", 0.95) 
bin2.add(audioconvertbin2, pitch2) 
audioconvertbin2.link(pitch2) 
bin2.add_pad(gst.GhostPad("sink", audioconvertbin2.get_pad("sink"))) 
bin2.add_pad(gst.GhostPad("src", pitch2.get_pad("src"))) 

bin3 = gst.Bin() 
audioconvertbin3 = gst.element_factory_make("audioconvert") 
pitch3 = gst.element_factory_make("pitch") 
pitch3.set_property("tempo", 1.1) 
bin3.add(audioconvertbin3, pitch3) 
audioconvertbin3.link(pitch3) 
bin3.add_pad(gst.GhostPad("sink", audioconvertbin3.get_pad("sink"))) 
bin3.add_pad(gst.GhostPad("src", pitch3.get_pad("src"))) 

op = gst.element_factory_make("gnloperation") 
comp.add(op) 

op2 = gst.element_factory_make("gnloperation", "op2") 
comp.add(op2) 

op3 = gst.element_factory_make("gnloperation", "op3") 
comp.add(op3) 

op.add(bin) 
op.props.start   = 0 * gst.SECOND 
op.props.duration  = ? 
op.props.priority  = 1 
op2.add(bin2) 
op2.props.start   = ? 
op2.props.duration  = ? 
op2.props.priority  = 1 
op3.add(bin3) 
op3.props.start   = ? 
op3.props.duration  = ? 
op3.props.priority  = 1 

pipeline = gst.Pipeline() 
audioconvert = gst.element_factory_make("audioconvert") 
encoder = gst.element_factory_make("vorbisenc") 
mux = gst.element_factory_make("oggmux") 
filesink = gst.element_factory_make("filesink") 
filesink.set_property("location", "output.ogg") 
pipeline.add(comp, audioconvert, encoder, mux, filesink) 
gst.element_link_many(audioconvert, encoder, mux, filesink) 

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

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

"최고"값은 "?"입니다. 위치 : 템포 고려하지 않아야 간단히 말해서

gsrc1 = gst.element_factory_make("gnlfilesource") 
gsrc1.props.location = "file1" 
gsrc1.props.start   = 0 
gsrc1.props.duration  = 12 * 1.05 * gst.SECOND 
gsrc1.props.media_start = 0 
gsrc1.props.priority  = 3 
comp.add(gsrc1) 

gsrc2 = gst.element_factory_make("gnlfilesource") 
gsrc2.props.location = "file2.mp3" 
gsrc2.props.start   = int(12 * 1.05 * gst.SECOND) 
gsrc2.props.duration  = int(12 * gst.SECOND) 
gsrc2.props.media_start = 36 * gst.SECOND 
gsrc2.props.priority  = 4 
comp.add(gsrc2) 

gsrc3 = gst.element_factory_make("gnlfilesource") 
gsrc3.props.location = "file3.mp3" 
gsrc3.props.start   = int(12 * 1.05 * gst.SECOND + 12 * gst.SECOND) 
gsrc3.props.duration  = int(12 * 1.1 * gst.SECOND) 
gsrc3.props.media_start = 60 * gst.SECOND 
gsrc3.props.priority  = 4 
comp.add(gsrc3) 

op.add(bin) 
op.props.start   = 0 * gst.SECOND 
op.props.duration  = int(12 * 1.05 * gst.SECOND) 
op.props.priority  = 1 

op2.add(bin2) 
op2.props.start   = int(12 * 1.05 * gst.SECOND) 
op2.props.duration  = int(12 * gst.SECOND) 
op2.props.priority  = 1 

op3.add(bin3) 
op3.props.start   = int(12 * 1.05 * gst.SECOND + 12 * gst.SECOND) 
op3.props.duration  = int(12 * 1.1 * gst.SECOND) 
op3.props.priority  = 1 

이 < 일이 어떤 결과를 가지고있다 변경,하지만 당신은 계정 템포로해야 변경> 1 (이 사용자의 관점에서, 이상한 행동의 종류).

이 내용을 Audacity와 비교해 보았을 때 두 개의 발췌 록 사이에 0.026의 간격이 좁은 경우를 제외하면 거의 동일한 결과가 나타납니다. 이것은 반올림 오류로 인한 것 같지 않습니다. 어쩌면 내 지속 시간/시작 시간이 정확하게 올바르게 설정되지 않았을 수도 있습니다 (아래 이미지의 차이 참조).

Gap between excerpts

은 어떤 사람들을 도움이되기를 바랍니다.