0

当我使用:

setNotifyInterval(1),我注意到它有时会跳过一毫秒。例如:当我打印媒体的位置时,它通常会跳过 2 秒而不是 1 秒。这是一个问题,因为我希望程序每 10 秒停止一次,如果它跳过一毫秒就不会停止。

例如:如果我希望视频在 10 秒(10000 毫秒)处停止,当我输出位置时有时会这样:

9999 毫秒

10001 毫秒

所以跳过了 10000 毫秒的位置,视频不会停止。以前有没有其他人遇到过这个问题?是由于视频缓冲还是计算机延迟?谢谢你的帮助。

该方法的文档是:setNotifyInterval(milliseconds)

编辑:我感谢你们的帮助。以下是对该示例的更多解释:

所以我有一个positionChanged连接到positionChanged插槽的信号。(positionChanged 方法与信号名称相同,但可以更改为任何其他名称)。

因此,我称之为连接信号槽机制:self.mediaPlayer.positionChanged.connect(self.positionChanged)

positionChanged 方法告诉视频每 10 秒停止一次,所以它看起来像这样:

def positionChanged(self, position):
    if position % 10000 == 0: # 10000 milliseconds is 10 seconds
    self.mediaPlayer.pause()

视频播放器有时不会每 10 秒停止一次。这是因为setNotifyInterval(1) isn't always accurate. 我将使用 musicamante 所说的,并检查播放器是否大于或等于 10 秒。谢谢你的帮助

4

1 回答 1

0

QMediaPlayer不适用于极其精确的播放时间戳;其目的是使用高级API 播放(或录制)。

1ms 的通知间隔有点没有意义,而且要求很高(尤其是因为我们正在谈论 python,这是一个可怕的瓶颈);此外,不能保证每毫秒都会准确发送通知,因为也不能保证报告的位置与播放中的特定毫秒相匹配。引擎尝试以指定的间隔发送通知,但由于时间的计算取决于许多方面(并且需要时间),因此可能会跳过某些位置,而其他位置甚至会重复。
声音缓冲区可能非常大,视频播放速度通常不会超过 60fps(也就是每 ~16ms 一帧,但对于标准 25fps 视频,它是每 40ms 一帧);您将始终获得位置的近似值,并且精度取决于底层后端:当您停止播放时,已经将更多音频添加到缓冲区中,并且无论如何都会播放。

无论如何,解决方案很简单:不要检查持续时间是否等于10000,而只需检查它是否大于或等于10000。

于 2022-02-16T19:49:45.000 回答