从机模式下的Mplayer - 多个实例

时间:2013-01-03 14:00:05

标签: qt qprocess mplayer

我正在开发一个显示各种媒体的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;
}        

1 个答案:

答案 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