GStreamer随时间变化的问题

GStreamer随时间变化的问题,gstreamer,python-gstreamer,Gstreamer,Python Gstreamer,我使用GStreamer播放音频,并定期要求提供我在文件中的位置的时间戳 如果我调整播放速率,无论是使用指定新播放速率的seek命令,还是使用“pitch”之类的插件来调整“tempo”组件。当GStreamer调整音频的长度及其当前位置以考虑其播放的速度时,所有计时都将消失。比如说,18秒时的时间现在是14秒。 我也尝试过停止音频,重新开始,通过新的设置,并以1.00的速率发出seek,还有节奏速率,这两种方式都不起作用。我现在已经没有主意了,所以我请求这样做 示例代码 #Slow down

我使用GStreamer播放音频,并定期要求提供我在文件中的位置的时间戳

如果我调整播放速率,无论是使用指定新播放速率的seek命令,还是使用“pitch”之类的插件来调整“tempo”组件。当GStreamer调整音频的长度及其当前位置以考虑其播放的速度时,所有计时都将消失。比如说,18秒时的时间现在是14秒。
我也尝试过停止音频,重新开始,通过新的设置,并以1.00的速率发出seek,还有节奏速率,这两种方式都不起作用。我现在已经没有主意了,所以我请求这样做

示例代码

#Slow down rate of file play
def OnSlow(self, evt):
    media_state = self.media_get_state()
    self.rate = Gpitch.get_property("tempo")
    if self.rate > 0.2:
        self.rate = self.rate - 0.10
        Gpitch.set_property("tempo", self.rate)
        r = "%.2f" % (self.rate)
        self.ma3.SetLabel("Speed: "+r)
        if media_state == Gst.State.PLAYING or media_state == Gst.State.PAUSED:
            self.timer.Stop() #momentarily stop updating the screen
            seek_event = Gst.Event.new_seek(self.rate, Gst.Format.TIME, 
                (Gst.SeekFlags.FLUSH),#NONE),
                Gst.SeekType.NONE, 0, Gst.SeekType.NONE, -1)
            Gplayer.send_event(seek_event)
            time.sleep(0.1)
            self.timer.Start() #Restart updating the screen
我尝试将持续时间和当前位置乘以调整,试图将时间戳拉回到或推回到它们的位置,就好像是以正常速度播放,但没有效果

我一直在为这件事发愁,真正的麻烦是,如果我用Vlc作为我的音频引擎执行同样的任务,它会工作,但我必须单独改变音高。转移到GStreamer的全部原因是pitch插件跟踪“tempo”组件,但是如果我无法获得准确一致的时间戳,那么项目就完蛋了


我的问题是,是否有人a)遇到了这个问题并掌握了它

对于任何发现自己处于类似困境的人来说,答案似乎在于
soundtouch音高
插件和GStreamer的播放速度之间的根本性较量

Audacity甚至在用户手册中记录了这一点

我最终找到了解决这个问题的唯一方法,就是完全从管道中删除
pitch
插件,因为只要把它放在管道中就足以把事情搞砸。
相反,我使用
ladspa-am-pitchshift-1433-so-ampitchshift
插件来调整音频的音高,左GStreamer使用普通
seek
命令来改变速率,同时改变速率,以提供更慢和更快的播放速率。
这样,时间戳保持一致,但必须手动调整节距。尽管它可以通过从给定播放速率的预定义音高值列表中选择来实现半自动化。
我相信这可以让其他人省去两天的挠头

附加说明:
即使GStreamer的工作时间为纳秒,如果您认为在执行搜索时不使用标志Gst.SeekFlags.accurial不会产生太大的影响,您也会大错特错。
我注意到,如果seek没有使用准确标志,当GStreamer被要求报告其当前位置时,不使用准确标志可能会产生长达10秒的差异。
所以预先警告就是预先准备好的。 (请注意,使用此标志将使搜索花费更长的时间,但至少在给出一致结果的情况下)