小编Jan*_*__ 的帖子

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

我目前正在将应用程序从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,是否有任何类似案例的经验?我坚持这个.

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

一月

c++ qt5 qiodevice qmediaplayer qtmultimedia

2
推荐指数
1
解决办法
2602
查看次数

标签 统计

c++ ×1

qiodevice ×1

qmediaplayer ×1

qt5 ×1

qtmultimedia ×1