在 RPi3 下的 Qt5.9.2 中,我通过以下方式启动 omxplayer:
QProcess *_omx = new QProcess(this);
void MyQPlayer::play(QString uri)
{
QStringList args;
args << "-o" << "0" << "-i" << "0";
args << "omxplayer";
args << "--vol=-6000";
args << "-I" << "-s";
args << "-o" << "hdmi" << uri;
_omx->start("stdbuf", args, QProcess::Unbuffered | QProcess::ReadWrite);
}
我需要使用stdbuf
来避免缓冲,否则我无法“实时”读取应用程序的输出。
当视频结束时,omxplayer 应该立即退出 - 当我从命令行启动它时它会退出:
$ stdbuf -o 0 -i 0 omxplayer --vol=6000 -I -s -o hdmi myfile.mp4
相反,当从我的应用程序启动时,一旦视频结束,它会在退出前保持执行约 15 秒。我捕捉到finished()
信号并确认它很好地退出:退出代码 = 0 和退出状态 = NormalExits。
我不确定这些其他信息是否有用或完全是另一个问题,但我还是在这里报告。要暂停视频,我在管道上发送字母“p”:
void MyPlayer::pause()
{
qDebug() << "toggle pause";
if (_omx->state() == QProcess::Running)
{
_omx->write("p");
}
}
调试打印告诉我每次调用该函数时都会调用该函数,但通常我需要多次调用它才能真正暂停或恢复视频执行。
缓冲应该不是问题,因为我的命令行应该避免这种情况。