我正在编写一个应用程序,允许用户浏览打开的视频。使用 Qt 5.3 在 Windows 7/8 上进行开发,我一直在使用QMediaPlayer
and QVideoWidget
遵循qvideowidget
示例项目。结果已经很不错了,除了QVideoWidget
好像只在空闲的时候更新。尽管如此,这仍然是一个良好的开始并且可用。
然而,当我在 Mac OS 10.10(同样使用 Qt 5.3)上构建时,擦洗的行为就好像视频中每秒只有一帧一样。当我拖动“位置”滑块时,视频会从一帧跳到一秒后的帧,然后再跳一秒,即使我正在调用QMediaPlayer::setPosition
几次在这两个帧之间的位置。
可以使用以下命令重现该问题videowidget
这里是 Qt 5.3 附带的示例:Qt\Examples\Qt-5.3\multimediawidgets\videowidget
。在 Windows 机器上拖动滑块时,QVideoWidget
在间隔相当近的帧之间移动。当在 Mac 上(至少在我的)上拖动滑块时,QVideoWidget
在相隔约一秒的帧之间跳转。无论我等待“中间”帧渲染多久,除非我点击“播放”按钮,否则它不会发生。
我试过打电话QMediaPlayer::play()
and QMediaPlayer::pause()
一个接一个地强制更新,但这似乎不起作用——QMediaPlayer
异步工作,因此更新没有时间生效。
如果我检查的值QMediaPlayer::position
,我发现它实际上在这些跳跃之间没有改变。看来当我打电话时QMediaPlayer::setPosition
,它实际上在 Mac 上将位置舍入为一秒增量,在 Windows 计算机上舍入为更精细的增量。
理想情况下,我想跳到视频中的特定位置并立即在视频上渲染该帧QVideoWidget
。有什么办法可以强制QMediaPlayer
准确设置位置并更新关联QVideoWidget
?有没有更好的方法在视频中实现平滑擦洗?
感谢您的帮助!
万一其他人也有类似的问题...
我最好的猜测是,该问题源于所使用的编解码器的限制QMediaPlayer
,因为这似乎是两个平台之间的主要区别。我没有直接处理编解码器问题,而是寻找其他选择。
MLT
(http://www.mltframework.org/ http://www.mltframework.org/)看起来很有希望,但编译起来很痛苦,而且主要作者似乎已经决定只向商业用户提供 SDK 支持。
libVLC
(https://wiki.videolan.org/LibVLC/ https://wiki.videolan.org/LibVLC/)看起来好多了。特别是,我一直在使用vlc-qt
(https://github.com/ntadej/vlc-qt https://github.com/ntadej/vlc-qt)。后者的界面对于用户来说看起来非常熟悉QMediaPlayer
and QVideoWidget
。在我自己的应用程序中,这是一个简单的替换,结果是 Windows 和 Mac 上的视频擦除更加流畅。
希望这对其他人有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)