現在、アプリケーションを Qt4(.8.4) から Qt5(.2.0) に移植しています。非推奨の toAscii() 関数、QtGui の欠落など、既知のすべての変更をほぼ完了しました。現在、フォノン フレームワークを使用する音楽プレーヤーがありましたが、これはサポートされなくなり、QMediaPlayer と一連の Audio-Handling クラスを含む QtMultimedia モジュールに置き換えられました。
プレーヤーの実装は、カスタム 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 にストリーミングすることによると、同様のケースで誰か経験がありますか? 私はこれで立ち往生しています。
よろしくお願いいたします。
1月