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

Jan*_*__ 2 c++ qt5 qiodevice qmediaplayer qtmultimedia

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

我们的播放器实现采用自定义QIODevice.此设备为磁盘上的加密audiofiles提供接口.现在播放器向设备询问x字节,设备从加密文件中读取,解密播放器要求的字节并返回它们.

现在我在多媒体模块中搜索了一个函数来重用我的IODevice并找到了以下函数:

void setMedia(const QMediaContent & media, QIODevice * stream = 0)
Run Code Online (Sandbox Code Playgroud)

并使用如下:

m_pDecryptingMediaDevice = new BYIODevice(filename);    
m_pDecryptingMediaDevice->open(QIODevice::ReadOnly);    
m_pPlayer->setMedia(0, m_pDecryptingMediaDevice);
Run Code Online (Sandbox Code Playgroud)

其中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)));
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这根本不起作用 - 不是在Windows上,而是在Mac OS上.总是有效的是给玩家一个URL

根据使用函数setMedia(const QMediaContent&media,QIODevice*stream = 0)将QIODevice流式传输到QMediaPlayer,是否有任何类似案例的经验?我坚持这个.

最好的问候和许多提前感谢.

一月

Jan*_*__ 9

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

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

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