我正在开发一个显示各种媒体的 Qt 应用程序。目前视频文件存在问题。由于在使用带 ATI 显卡加速的 Phonon 时存在一些问题,我们目前在从属模式下使用 mplayer 和 vaapi。
但是,加载文件存在问题。每次显示新文件时,mplayer 需要一些时间(大约 2 秒)来加载它,只显示黑屏。由于大多数文件都很短(10 - 25 秒),因此非常引人注目。第一个问题是 - 有人知道如何告诉 mplayer 在播放前一个文件时开始加载一个文件吗?可能吗?
第二个:我正在考虑创建两个 mplayer 实例,告诉一个加载第一个文件,另一个加载第二个文件,然后告诉第二个暂停。第一个文件完成后,我会取消暂停第二个文件。我正在使用 QProcesses 但现在第二个 mplayer 在第二个完成之前不会启动,即使我没有暂停它。在下面的代码中,player1 和 player2 是 QProcess 对象,player2 在 player1 完成之前不会开始做任何事情。所有“readyRead ...”插槽都是我解析 mplayer 输出的函数。到目前为止,他们并没有做太多,只是将输出打印到 qDebug()。
你知道为什么这两个过程不一起开始吗?如果我在 player1 中使用例如 mplayer,在 player2 中使用 vlc,它可以正常工作,我可以从命令行运行两个 mplayer 实例。
bool Player::run(){
QStringList args;
args << "-va" << "vaapi" << "-vo" << "vaapi:gl" << "-noborder" << "-framedrop" << "-v" << "-slave" << "-idle";
connect(&player1, SIGNAL(readyReadStandardError()), this, SLOT(readyReadErr1()));
connect(&player1, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadOut1()));
connect(&player2, SIGNAL(readyReadStandardError()), this, SLOT(readyReadErr2()));
connect(&player2, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadOut2()));
player1.start("mplayer", args << "-geometry" << "860x540+0+0");
player2.start("mplayer", args << "-geometry" << "860x540+800+500");
player1.write("loadfile w_1.avi 1\n");
player2.write("loadfile w_2.avi 1\n");
if (!player1.waitForStarted(5000))
{
return false;
}
player2.waitForStarted(5000);
player1.waitForFinished(50000);
player2.waitForFinished(10000);
return true;
}