Потоковая передача 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)));

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

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

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

январь

Ответы на вопрос(2)

Ваш ответ на вопрос