QMediaplayer从Mac OS上加密的自定义QIODevice流式传输(10.9)

时间:2014-01-28 11:32:43

标签: c++ qt5 qmediaplayer qiodevice qtmultimedia

我目前正在将应用程序从Qt4(.8.4)移植到Qt5(.2.0)。 我几乎完成了所有已知的更改,例如弃用toAscii() - 函数,缺少QtGui等等。现在我们有了一个使用声子框架的音乐播放器,它不再受支持,被QtMultimedia模块取代,包括QMediaPlayer和一堆音频处理类。

我们对播放器的实现采用了自定义QIODevice。此设备为磁盘上的加密audiofiles提供接口。现在,播放器向设备询问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-subclass,m_pPlayer是QMediaPlayer。

现在在Windows上,一切都按预期工作。 QMediaplayer将其MediaStatus更改为QMediaPlayer :: LoadingMedia并向我的设备询问字节数。然后更改为QMediaPlayer :: State PlayingState,状态设置为BufferedMedia。 一切安好。 在Mac OS上的不幸(10.9.1)我只得到QMediaPlayer :: PlayingState而已。播放器/ audiobackend从不向我的设备询问字节数,也不调用任何其他功能。 我不认为这个错误与自定义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,是否有任何类似案例的经验?我坚持这个。

致以最诚挚的问候和许多感谢。

2 个答案:

答案 0 :(得分:9)

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

Backends for each platform/OS

正如您所看到的,DirectShow-Plugin(Windows)支持流源,而AVM Foundation / Quicktime 7(OSX)没有流媒体支持。所以我想唯一的解决方案似乎是通过应用程序(gstreamer,vlc)提供自定义后端。

答案 1 :(得分:0)

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