0

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

如果我调整播放速率,无论是使用指定新播放速率的 seek 命令,还是使用诸如“pitch”之类的插件来调整“tempo”组件。当 GStreamer 调整音频的长度及其当前位置以考虑其播放速度时,所有时间都会超出窗口。例如,原来的 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) 掌握了它

4

1 回答 1

0

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

Audacity 甚至在他们的用户手册中记录了这一点。

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

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

于 2015-08-29T15:39:48.510 回答