我正在开发一个显示各种媒体的Qt应用程序。目前,视频文件存在问题。由于使用Phonon和ATI图形卡加速存在一些问题,我们目前正在使用mplayer和vaapi在从模式下。
但是加载文件存在问题。每次要显示新文件时,mplayer都需要一些时间(约2秒)来加载它,只显示黑屏。由于大多数文件相当短(10 - 25秒),因此非常明显。 第一个问题是 - 有人知道如何告诉mplayer在播放前一个文件时开始加载一个文件吗?有可能吗?
第二个:我正在考虑创建两个mplayer实例,告诉一个加载第一个文件,另一个加载第二个文件然后告诉第二个文件暂停。第一个文件完成后,我将取消暂停第二个文件。我正在使用QProcesses但是现在第二个mplayer在第二个mplayer结束之前不会启动,即使我没有暂停它。在下面的代码中,player1和player2是QProcess对象,在player1完成之前,player2将不会开始执行任何操作。所有“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;
}
答案 0 :(得分:1)
我不知道你是否在此期间找到了解决问题的方法,但是我正在使用bash脚本做类似的事情,启动多个实例可以很好地处理背景问题。双mplayer技巧也很好,我想我可能不得不使用它。无论如何,我的bash hack几个小时后,但请注意FIFO目前只为其中一个创建,我正在考虑一个好的命名方案:
#!/bin/bash
set -e
set -u
# add working directory to $PATH
export PATH=$(dirname "$0"):$PATH
res_tuple=($(xres.sh))
max_width="${res_tuple[0]}"
max_height="${res_tuple[1]}"
echo "w = $max_width, h = $max_height"
mplayer() {
/home/player/Downloads/vaapi-mplayer/mplayer \
-vo vaapi \
-va vaapi \
-fixed-vo \
-nolirc \
-slave \
-input file="$5"\
-idle \
-quiet \
-noborder \
-geometry $1x$2+$3+$4 \
{ /home/player/Downloads/*.mov } \
-loop 0 \
> /dev/null 2>&1 &
}
mfifo() {
pipe='/tmp/mplayer.pipe'
if [[ ! -p $pipe ]]; then
mkfifo $pipe
fi
}
half_width=$(($max_width / 2))
half_height=$(($max_height / 2))
mfifo
mplayer $half_width $half_height 0 0 $pipe
mplayer $half_width $half_height $half_width 0 $pipe
mplayer $half_width $half_height 0 $half_height $pipe
mplayer $half_width $half_height $half_width $half_height $pipe