Потоковая передача 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 & медиа, QIODevice * stream = 0)? Я застрял с этим.

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

январь

2

Решение

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

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

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

9

Другие решения

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

0

По вопросам рекламы [email protected]