2

現在、アプリケーションを 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月

4

2 に答える 2

9

ちょうどこのページに来ました。各プラットフォームで使用可能な/選択されたオーディオ バックエンドが一覧表示されます。

各プラットフォーム/OS のバックエンド

ご覧のとおり、DirectShow-Plugin (Windows) はストリーム ソースをサポートしていますが、AVM Foundation/Quicktime 7 (OSX) はストリーミングをサポートしていません。したがって、唯一の解決策は、アプリケーション (gstreamer、vlc) にカスタム バックエンドを同梱することだと思います。

于 2014-01-28T12:16:30.353 に答える