我开发了一个用户可以同时播放多个声音的应用程序。为此,我将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)
或将媒体设置为空QMediaContent
media->setMedia(QMediaContent())
以使播放器丢弃与当前媒体源相关的所有信息,则应用程序会冻结。
这两个操作对别人的声音很好。
如果我不删除这种QMediaPlayer
,我就没有声音了。不知何故,QMediaPlayer
的实例数量有限,而且我不能删除的每个QMediaPlayer
都会填写此数字,并且无法为QMediaPlayer
的新实例留出空间。
问题是:如何避免这个问题?如果我限制同时发声的数量,那么QMediaPlayer
个实例的正确数量是多少?如果我设置了限制,则对于其他计算机,此限制可能会很高。或者如何正确检测这个格式错误的QMediaPlayer并正确删除它?
另外,如果我等待第一个QMediaPlayer::ResourceError
信号来限制声音的数量,这有时为时已晚,因为稍后会发出错误信号,有时应用程序已经创建了格式错误{{1}我不能再删除,这会阻止进程关闭。