我正在编写一个应用程序,它将允许用户通过打开的视频进行擦洗。在带有Qt 5.3的Windows 7/8上进行开发,在QMediaPlayer
示例项目之后,我一直在使用QVideoWidget
和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上(至少在我的Mac上)拖动滑块时,QVideoWidget
在间隔约一秒的帧之间跳转。无论我等待“中间”帧渲染多长时间,除非按下“播放”按钮,否则都不会发生。
我尝试过一个接一个地调用QMediaPlayer::play()
和QMediaPlayer::pause()
来强制进行更新,但这似乎不起作用-QMediaPlayer
异步工作,因此更新没有时间生效。
如果我检查QMediaPlayer::position
的值,我发现在这些跳转之间它实际上并没有改变。看来,当我调用QMediaPlayer::setPosition
时,实际上是在Mac上将位置四舍五入为一秒的增量,而在Windows机器上是将其四舍五入的增量。
理想情况下,我想跳到视频中的特定位置并立即在QVideoWidget
上渲染该帧。有什么方法可以强制QMediaPlayer
准确设置位置并更新关联的QVideoWidget
?有没有更好的方法来实现视频中的平滑擦洗?
谢谢你的帮助!
最佳答案
万一其他人有类似的问题...
我最好的猜测是,此问题源于QMediaPlayer
使用的编解码器的局限性,因为这似乎是两个平台之间的主要区别。我没有直接处理编解码器问题,而是四处寻找其他选择。MLT
(http://www.mltframework.org/)似乎很有前途,但编译起来很麻烦,主要作者似乎已经决定只向商业用户提供SDK支持。libVLC
(https://wiki.videolan.org/LibVLC/)看起来好多了。特别是,我一直在使用vlc-qt
(https://github.com/ntadej/vlc-qt)。后者的界面对于QMediaPlayer
和QVideoWidget
的用户来说将非常熟悉。在我自己的应用程序中,这很容易替换,结果是Windows和Mac上的视频清理更加流畅。
希望这对别人有帮助!
关于c++ - 强制QMediaPlayer为视频清理应用程序准确更新位置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27006902/