2

我目前正在将应用程序从 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,有人在类似情况下有任何经验吗?我被这个困住了。

最好的问候,并提前非常感谢。

4

2 回答 2

9

刚来到这个页面。列出了每个平台的可用/选择的音频后端:

每个平台/操作系统的后端

如您所见,DirectShow-Plugin (Windows) 支持流源,而 AVM Foundation/Quicktime 7 (OSX) 不支持流。所以我想唯一的解决方案似乎是随应用程序(gstreamer、vlc)一起提供自定义后端。

于 2014-01-28T12:16:30.353 回答
0

无论如何,尝试将空的 QMediaContent() 设置为 setMedia 而不是 0。它对我来说工作正常(但是,我在 linux 中尝试)在你的小型测试项目中,你使用 mp3——我不确定它是否受支持。

于 2017-10-20T15:11:44.223 回答