さまざまなメディアを表示している Qt アプリケーションを開発しています。現在、動画ファイルに問題があります。ATI グラフィック カード アクセラレーションで Phonon を使用するといくつかの問題が発生したため、現在、スレーブ モードで vaapi を使用して mplayer を使用しています。
ただし、ファイルのロードには問題があります。新しいファイルが表示されるたびに、mplayer はそれをロードするのに時間がかかり (約 2 秒)、黒い画面しか表示されません。ほとんどのファイルはかなり短い (10 ~ 25 秒) ため、かなり目立ちます。最初の質問は、mplayer に前のファイルの再生中に 1 つのファイルのロードを開始するように指示する方法を知っている人はいますか? 出来ますか?
2 つ目: mplayer の 2 つのインスタンスを作成し、一方に最初のファイルをロードし、もう一方に 2 番目のファイルをロードしてから 2 番目のファイルを一時停止するように指示することを考えていました。最初のファイルが終了したら、2 番目のファイルの一時停止を解除します。QProcesses を使用していますが、現在、一時停止していなくても、2 番目の mplayer が終了する前に 2 番目の mplayer が開始されません。以下のコードでは、player1 と player2 は QProcess オブジェクトであり、player1 が終了するまで player2 は何も開始しません。すべての「readyRead ...」スロットは、mplayer 出力を解析するための関数です。出力を qDebug() に出力するだけです。
2 つのプロセスが一緒に開始されない理由がわかりましたか? たとえば、player1 で mplayer を使用し、player2 で vlc を使用し、コマンド ラインから 2 つの 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;
}