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)或将媒体设置为 nullQMediaContent media->setMedia(QMediaContent())以使播放器丢弃与当前媒体源相关的所有信息,则应用程序将冻结。这两个操作在其他声音上效果很好。如果我不删除这种QMediaPlayer,我最终没有声音的空间。不知何故QMediaPlayer,实例数量有限QMediaPlayer,我无法删除的每一个都填写这个数字,并且没有空间容纳QMediaPlayer.

问题是:我怎样才能避免这个问题?如果我限制同时声音的数量,正确的QMediaPlayer实例数量是多少?如果我设置一个限制,这个限制对于其他机器来说可能会很高。或者如何正确检测到这个格式错误的 QMediaPlayer 并正确删除它?

另外,如果我等待第一个QMediaPlayer::ResourceError信号来限制声音的数量,这有时为时已晚,因为错误信号会稍后发出,有时应用程序已经创建了一个QMediaPlayer我无法删除的畸形,这会阻止进程关闭.

4

0 回答 0