3

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

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

可以使用videowidgetQt 5.3 附带的示例在此处重现该问题: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?有没有更好的方法在视频中实现平滑擦洗?

谢谢你的帮助!

4

1 回答 1

1

万一其他人有类似的问题......

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

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

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

希望这对其他人有帮助!

于 2014-11-25T23:23:20.983 回答