GStreamer 时间问题

GStreamer issue with time

我使用 GStreamer 播放音频并且经常需要我在文件中的位置的时间戳。

如果我调整播放速率,无论是使用指定新播放速率的搜索命令,还是使用“pitch”之类的插件来调整“tempo”组件。当 GStreamer 调整音频的长度及其当前位置以考虑播放速度时,所有时间都超出了 window。例如,原来的 18 秒现在变成了 14 秒。
我也试过停止音频并重新开始通过新设置并以 1.00 的速率发出搜索并且速度也没有奏效。我暂时没有 运行 想法,因此向 SO 提出请求。

示例代码

#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 的全部原因是音高插件跟踪“节奏”组件,但如果我不能获得准确和一致的时间戳,该项目就完蛋了。

我的问题是,有没有人 a) 遇到过这个问题并且 b) 掌握了它

对于任何发现自己处于类似困境的人来说,答案似乎在于 soundtouch pitch 插件和 GStreamer 的播放速度之间的根本斗争。

Audacity 甚至在其用户手册中对此进行了说明。

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

补充说明:
尽管 GStreamer 以纳秒为单位工作,并且人们认为在执行查找时不使用标志 Gst.SeekFlags.ACCURATE 不会产生太大差异是可以原谅的,但人们会大错特错。
我注意到,当要求 GStreamer 报告其当前位置时,如果搜索未使用 ACCURATE 标志,则不使用 ACCURATE 标志可能会产生长达 10 秒的差异。
所以预先警告就是预先武装。 (请注意,使用此标志会使查找时间更长,但至少如果给出一致的结果)