3

ユーザーが同時に複数のサウンドを再生できるアプリケーションを開発しています。このためQMediaPlayerに、マトリックスと組み合わせて使用​​し、各サウンドを個別に保持します。コードは単純です。各サウンドに対して、次のようなコードを使用します。

media = new QMediaPlayer();
media->setMedia(QUrl::fromLocalFile(QFileInfo("sound.mp3").absoluteFilePath()));
media->play();

全て大丈夫。しかし、サウンド 115-125 (同時サウンド) を再生すると、新しいサウンドがerror(QMediaPlayer::ResourceError)エラー コードの信号を発します: QMediaPlayer::ResourceError - A media resource couldn't be resolved. エラー信号を送信する前に、次のメッセージを出力に出力します。DirectShowPlayerService::doPlay: Unresolved error code 0x80004005 ()

このエラーを検出するとすぐにこれらのサウンドを削除するため、これは問題ではありません。問題は、数回の直後に発生しますQMediaPlayer::ResourceError。新しいサウンドを作成すると、出力ウィンドウにエラー メッセージが表示されます:このエラーは、新しいインスタンスQThread::start: Failed to create thread. を作成した直後に表示されます:QMediaPlayer

qDebug() << "before media = new QMediaPlayer(); (FILE)";
media = new QMediaPlayer();
qDebug() << "after media = new QMediaPlayer(); (FILE)" << media->error

出力:

before media = new QMediaPlayer(); (FILE)
QThread::start: Failed to create thread
after media = new QMediaPlayer(); (FILE) QMediaPlayer::NoError

この最後の種類のQMediaPlayerインスタンスはエラーを出しません。以上、状態はQMediaPlayer::PlayingStateです。しかし、それを削除しようとしdelete(media)たり、メディアを null に設定しQMediaContent media->setMedia(QMediaContent())てプレーヤーに現在のメディア ソースに関連するすべての情報を破棄させようとすると、アプリケーションがフリーズします。これらの 2 つの操作は、他のサウンドに対して正常に機能します。こういうのを消さないとQMediaPlayer、音の余地がなくなってしまいます。どういうわけかQMediaPlayer、インスタンスの数が限られており、QMediaPlayer削除できないすべてのインスタンスがこの数を埋め、 の新しいインスタンスのための余地がありませんQMediaPlayer

問題は、この問題を回避するにはどうすればよいかということです。QMediaPlayer同時サウンドの数を制限した場合、インスタンスの正しい数はいくつですか? 制限を設定すると、この制限は他のマシンにとって高くなる可能性があります。または、この不正な QMediaPlayer を適切に検出し、適切に削除する方法は?

また、最初のシグナルを待ってQMediaPlayer::ResourceErrorサウンドの数を制限すると、遅すぎる場合があります。これは、エラーシグナルが少し遅れて発せられ、アプリケーションがすでにQMediaPlayer削除できない不正な形式を作成し、プロセスを閉じることができないためです。 .

4

0 に答える 0