【问题标题】:Force QMediaPlayer to update position accurately for video scrubbing application?强制 QMediaPlayer 为视频擦洗应用程序准确更新位置?
【发布时间】:2015-01-16 09:13:28
【问题描述】:

我正在编写一个允许用户浏览打开的视频的应用程序。在使用 Qt 5.3 的 Windows 7/8 上进行开发时,我一直在使用 QMediaPlayerQVideoWidget 遵循 qvideowidget 示例项目。结果非常好,除了QVideoWidget 似乎只在空闲时间更新。不过,这是一个良好的开端并且可以使用。

但是,当我在 Mac OS 10.10(再次使用 Qt 5.3)上构建时,擦洗的行为就像视频中每秒只有一帧一样。当我拖动“位置”滑块时,视频会在一秒钟后从一帧跳到另一帧,然后再过一秒钟,即使我多次调用 QMediaPlayer::setPosition 时,这两帧之间的位置也是如此。

可以使用 Qt 5.3 附带的 videowidget 示例重现该问题:Qt\Examples\Qt-5.3\multimediawidgets\videowidget。在 Windows 机器上拖动滑块时,QVideoWidget 在相距相当近的帧之间移动。在 Mac 上(至少在我的)上拖动滑块时,QVideoWidget 在相隔约一秒的帧之间跳转。无论我等待“中间”帧渲染多长时间,除非我点击“播放”按钮,否则它不会发生。

我试过一个接一个地调用QMediaPlayer::play()QMediaPlayer::pause()来强制更新,但这似乎不起作用--QMediaPlayer异步工作,所以更新没有时间效果。

如果我检查QMediaPlayer::position 的值,我发现在这些跳转之间它实际上并没有改变。看来,当我调用QMediaPlayer::setPosition 时,它实际上是在 Mac 上将位置四舍五入为一秒增量,而在 Windows 机器上则更精细。

理想情况下,我想跳转到视频中的特定位置并立即在QVideoWidget 上渲染该帧。有什么办法可以强制QMediaPlayer准确设置位置并更新关联的QVideoWidget?有没有更好的方法在视频中实现平滑擦洗?

感谢您的帮助!

【问题讨论】:

  • 更多信息:QMediaPlayer 中存储的位置的“粒度”似乎与视频的长度有关,但仅在 Mac 上。在 PC 上,即使有 2 GB 的视频,我仍然可以寻找相隔仅 0.1 秒的帧。然而,在 Mac 上,当我打开 2 GB 视频时,粒度约为 3 秒,但打开 400 MB 视频时,粒度约为 1 秒。这会为任何人敲响警钟吗?我对这里发生的事情有点茫然,所以任何帮助都将不胜感激。谢谢!

标签: c++ qt qtmultimedia qmediaplayer


【解决方案1】:

如果其他人有类似的问题...

我的最佳猜测是问题源于QMediaPlayer 使用的编解码器的限制,因为这似乎是两个平台之间的主要区别。我没有直接处理编解码器问题,而是四处寻找其他选择。

MLT (http://www.mltframework.org/) 看起来很有希望,但编译起来很麻烦,而且主要作者似乎已经决定只为商业用户提供 SDK 支持。

libVLC (https://wiki.videolan.org/LibVLC/) 看起来好多了。特别是,我一直在使用vlc-qt (https://github.com/ntadej/vlc-qt)。后者的界面对于QMediaPlayerQVideoWidget 的用户来说非常熟悉。它在我自己的应用程序中很容易替换,结果是在 Windows 和 Mac 上的视频清理更加流畅。

希望这对其他人有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多