Потоковая передача QMediaplayer из пользовательского QIODevice с шифрованием в Mac OS (10.9)

В настоящее время я портирую приложение с Qt4(.8.4) на Qt5(.2.0). Я почти закончил со всеми известными изменениями, такими как устаревшая функция toAscii(), отсутствует QtGui и так далее. Теперь у нас был музыкальный проигрыватель, использующий фононную среду, которая больше не поддерживается, и был заменен модулем QtMultimedia, включающим QMediaPlayer и несколько классов Audio-Handling.

Наша реализация плеера использует пользовательский QIODevice. Это устройство предоставляет интерфейс для зашифрованных аудиофайлов на диске. Теперь игрок запрашивает у устройства x байтов, устройство читает из зашифрованного файла, расшифровывает байты, запрошенные плеером, и возвращает их.

Теперь я искал функцию в мультимедийном модуле для повторного использования моего IODevice и нашел следующую функцию:

void setMedia(const QMediaContent & media, QIODevice * stream = 0)

и использовал его следующим образом:

m_pDecryptingMediaDevice = new BYIODevice(filename);    
m_pDecryptingMediaDevice->open(QIODevice::ReadOnly);    
m_pPlayer->setMedia(0, m_pDecryptingMediaDevice);

где m_pDecryptingMediaDevice - это подкласс QIODevice, а m_pPlayer - QMediaPlayer.

Теперь на Windows все работает как положено. QMediaplayer меняет свой MediaStatus на QMediaPlayer::LoadingMedia и запрашивает у моего устройства байты. Затем изменяется на QMediaPlayer::State PlayingState и устанавливается статус BufferedMedia. Все в порядке. К сожалению, в Mac OS (10.9.1) я получаю только QMediaPlayer::PlayingState и больше ничего. Плеер / аудиокейд никогда не запрашивает у моего устройства байты и не вызывает никаких других функций. Я не думаю, что ошибка относится к пользовательскому QIODevice, но к тому, как он передается QMediaPlayer, потому что проигрыватель даже не запрашивает никаких байтов и не вызывает какую-либо функцию на устройстве.

Я просто попытался разбить его на небольшой тестовый проект:

QMediaPlayer *player = new QMediaPlayer(this);
QFile *music = new QFile("C:/Users/.../Music/Test.mp3");
music->open(QIODevice::ReadOnly);
player->setMedia(0, music);
connect(ui->pushButton, SIGNAL(clicked()), player, SLOT(play()));
connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stateChanged(QMediaPlayer::State)));

Любопытно, что это не играет вообще - ни на окнах, ни на Mac OS. То, что всегда работает, дает URL-адрес игрока, как

Кто-нибудь сталкивался с подобным случаем в соответствии с потоковой передачей QIODevice в QMediaPlayer с использованием функции setMedia(const QMediaContent & media, QIODevice * stream = 0)? Я застрял с этим.

С наилучшими пожеланиями и большое спасибо заранее.

январь

2 ответа

Решение

Просто зашел на эту страницу. Там перечислены доступные / выбранные аудио-бэкэнды для каждой платформы:

Бэкэнды для каждой платформы / ОС

Как вы можете видеть, DirectShow-Plugin (Windows) поддерживает потоковые источники, тогда как AVM Foundation/Quicktime 7 (OSX) не поддерживает потоковую передачу. Таким образом, я думаю, что единственное решение, по-видимому, заключается в поставке пользовательского бэкэнда с приложением (gstreamer, vlc).

В любом случае, попробуйте дать пустой QMediaContent() для setMedia вместо 0. У меня это работает нормально (но я пробую в linux) В вашем небольшом тестовом проекте вы используете mp3 - я не уверен, поддерживается ли он.

Другие вопросы по тегам