我有一个从python gst绑定创建的gstreamer管道,它被设置为将耳机的麦克风播放回耳机的扬声器。这工作得很好,并在这样的管道中播放:
JackAudioSrc -> GstAudioMixer -> Queue -> GstJackAudioSink
然后很多秒后,我想播放一个短的10秒。wav文件到管道,这样wav文件与麦克风混合,并在耳机上听到。要做到这一点,GstFileSrc被动态地添加到GstAudioMixer中,以混合一个短的10秒wav文件到耳机的扬声器,它给出了这样的管道:
GstJackAudioSrc -> GstAudioMixer -> Queue -> GstJackAudioSink
/
Gstfilesrc -> Gstwavparse ->/
当Gstfilesrc和Gstwavparse文件被动态添加到混频器的sink pad时,在管道开始后的6秒内,只听到最后4秒的wav。
问题似乎是wav文件寻找相对于管道开始播放的时间。
我已尝试更改"do-timestamp";在multifilesrc中,gstidentity "sync"=True,并且找不到方法设置"live">
然而,如果将管道设置为Gst.State.NULL,然后在6秒添加filesrc时返回Gst.State.PLAYING,那么整个10秒的wav文件将很好地播放。当管道时间被设置为零时,这可以工作,但这会产生耳机上的点击,这是不可接受的。
我如何确保wav文件从wav文件开始播放,以便在耳机上听到整个10秒,如果在任何随机时间添加到管道?
更新:我现在可以通过在wavparse:
之前添加时钟同步并设置其时间戳偏移量来获得波文件的正确时间。nanosecs = pipeline.query_position(Gst.Format.TIME)[1]
clocksync.set_property("ts-offset", nanosecs)
虽然开始/停止时间现在是正确的,wav音频被损坏,听到的只是点击和闪烁,但至少它在正确的时间开始播放,并在正确的时间结束。请注意,如果没有时钟同步,wav文件音频是非常清晰的,它只是在错误的时间开始和停止。所以ts偏移在某种程度上破坏了音频。
为什么音频被损坏?
所以我得到了这个工作,答案是不使用时钟同步,而是请求混合器sink pad,然后在混合器sink pad上调用set_offset(nanosecs),然后将wavparse链接到混合器:
sink_pad = audio_mixer.get_request_pad("sink_%u")
nanosecs = pipeline.query_position(Gst.Format.TIME)[1]
sink_pad.set_offset(nanosecs)
sink_pad.add_probe(GstPadProbeType.IDLE, wav_callback)
def wav_callback(pad, pad_probe_info, userdata):
wavparse.link(audio_mixer)
wav_bin.set_state(Gst.State.PLAYING)
return Gst.PadProbeReturn.REMOVE
如果wav文件需要倒带/重放:
def replay_wav():
global wav_bin
global sink_pad
wav_bin.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH, 0)
nanosecs = pipeline.query_position(Gst.Format.TIME)[1]
sink_pad.set_offset(nanosecs)