ユーザーが同時に複数のサウンドを再生できるアプリケーションを開発しています。このため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
削除できない不正な形式を作成し、プロセスを閉じることができないためです。 .