我目前正在将应用程序从 Qt4(.8.4) 移植到 Qt5(.2.0)。我几乎完成了所有已知的更改,例如不推荐使用的 toAscii() 函数、缺少 QtGui 等等。现在我们有了一个使用 phonon 框架的音乐播放器,它不再受支持,并被 QtMultimedia 模块取代,包括 QMediaPlayer 和一堆音频处理类。
我们的播放器实现采用自定义 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,比如
根据使用函数 setMedia(const QMediaContent & media, QIODevice * stream = 0) 从 QIODevice 流式传输到 QMediaPlayer,有人在类似情况下有任何经验吗?我被这个困住了。
最好的问候,并提前非常感谢。
简