Я пишу приложение, которое позволит пользователю просматривать открытое видео. Разрабатывая на Windows 7/8 с Qt 5.3, я использую QMediaPlayer
а также 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
скачки между кадрами, разнесенными примерно на одну секунду. Независимо от того, как долго я жду рендеринга «промежуточного» кадра, этого не произойдет, пока я не нажму кнопку «Play».
Я пробовал звонить 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.
Надеюсь, это поможет кому-то еще!