我使用GStreamer播放音频,并且经常需要我在文件中的位置的时间戳。
如果我调整播放速率,可以使用指定新播放速率的搜索命令,或者如果我使用像“音调”这样的插件来调整“速度”组件。当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)掌握了它
答案 0 :(得分:0)
对于任何发现自己处于类似困境的人来说,答案似乎在soundtouch pitch
插件和GStreamer的播放率之间存在根本性的争论。
Audacity甚至在用户手册中记下了它。
我最终找到解决问题的唯一方法是将pitch
插件完全从管道中丢弃,因为只是将它放在那里就足以搞砸了。
相反,我使用ladspa-am-pitchshift-1433-so-ampitchshift
插件调整音频的音高,并使用普通seek
命令改变速率,同时改变速率,以提供更慢,更快的播放速率。
通过这种方式,时间戳保持一致,但是必须手动调整音高。虽然它可以通过从给定游戏率的预定义音高值列表中选择来实现半自动化
我相信这可以节省其他人2天的头部刮伤。
附加说明:
即使GStreamer在纳秒内工作,并且可以原谅我认为不使用标志Gst.SeekFlags.ACCURATE,在执行搜索时,不会产生那么大的差异,一个人会非常错误。
我注意到,当要求GStreamer报告其当前位置时,如果搜索没有使用ACCURATE标志,那么不使用ACCURATE标志可以产生最多10秒的差异。
所以预先警告是预先设定的。
(请注意,使用此标志会使搜索需要更长时间,但至少如果给出一致的结果)