QT学习_视频播放_ide


使用MediaPlayer

QT5版本以上使用

使用Phonon
QT4版本使用

单独使用phonon

//Phonon::VideoPlayer *player = new Phonon::VideoPlayer(Phonon::VideoCategory,&w);
//player->load(Phonon::MediaSource("/home/pi/Downloads/faceu_-413_20201227185851824.mp4"));
//player->play();

Phonon::MediaObject *mediaObject =new Phonon::MediaObject(&w);
Phonon::VideoWidget *videoWidget =new Phonon::VideoWidget(&w);
videoWidget->setScaleMode(Phonon::VideoWidget::ScaleAndCrop);
Phonon::createPath(mediaObject, videoWidget);

//QUrl url("//www.le.com/ptv/vplay/26311089.html");
//mediaObject->setCurrentSource(url);

QString str("/home/pi/Downloads/sample-mpg-file.mpg");
mediaObject->setCurrentSource(Phonon::MediaSource(str));

videoWidget->setAspectRatio(Phonon::VideoWidget::AspectRatioWidget);
mediaObject->play();
w.show();

常用phonon组合
Phonon + Phonon_mplayer +mplayer
因为phonon是QT一个播放媒体的API,但是自身不带解码器,需要配一个后端如mplayer,以及封装插件Phonon_mplayer来搭配使用,安装复杂

使用进程和mplayer
使用 QProgress +mplayer 是一个绕过API的方法,而且C语言也可以通过系统编程来控制mplayer
需要学习mplayer的控制指令

用一个按钮和窗口实现mplayer在窗口内播放
步骤:

  • 创建一个进程
  • 设置mplayer为slave、quiet模式
  • 设置要播放的文件名
  • 使用winId来获取内窗口位置,设置"-wid"来定位mplayer在哪个widget进行显示
  • 使用进程指令函数 start(command); 启动进程
void Widget::on_pushButton_clicked()
{
QProcess *process = new QProcess(this);
QStringList args;
args << "-slave"; //使用slave模式
args << "-quiet"; //不要输出冗余信息
args << "/home/pi/Videos/sample_640x360.mpg";
args << "-wid";
args << QString::number(ui->widget->winId());
qDebug()<<args;
process->start("mplayer", args); //启动该进程,并传入参数args
}

我们可以用linux C编程来完成对slave模式工作的Mplayer进行控制和信息获取。
如:

mkfifo(/tmp/fifo”,0777);

可以使用popen()来打开Mplayer

FILE* mp;
mp=popen(“mplyer /home/linux/1.mp3 -quiet –slave –input file=/tmp/fifo,”r”);

可以通过管道/tmp/fifo给mplayer发送命令,通过mp获取mplay的返回数据
如:

system(“echo /”mute 0/ > /tmp/fifo”);//写命令
fgets(buf,1000,mp);//读取mplay返回数据

而Qt给我们提供了更方便的实现方法。
通过定义一个QProcess对象调用已编译好的Mplayer。

QProcess *process = new QProcess();
process->setProcessChannelMode(QProcess::MergedChannels);
Process->start(“mplayer –ac mad xxxxx”);

在命令中添加 -slave 和 -quiet就可以通过命令设置Mplayer实现相应的功能。在mplayer源码中的,slave.txt中对这些命令有详细的讲解。

Process->start(“mplayer –slave –quiet –ac mad xxxxx”);

1、暂停功能
通过如下代码可以设置Mplayer暂停。

process->write(“pause/n”);

执行这段代码的时候如果是播放状态就会暂停,暂停状态时就会继续播放。

2、获取播放文件的总时间和当前播放进度
执行下面代码时,Mplayer将时间在标准输出显示。

process->write("get_time_pos/n");
process->write("get_time_length/n");

通过如下代码即可读出我们需要的信息:

connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(back_message_slots()));
process有可读取的信息时,发出信号,在槽函数back_message_slots()中读取信息。
void MPlayer::back_message_slots()
{
while(process->canReadLine())
{
QString message(process->readLine());
//message即为读取的信息我们可以根据需要取我们要的信息如
//文件总时间为:ANS_LENGTH=23.00
//当前时间为:ANS_TIME_POSITION=23.00
}
}

3、快进功能

seek [type]

Seek to some place in the movie.

0 is a relative seek of +/- seconds (default).

1 is a seek to % in the movie.

2 is a seek to an absolute position of seconds.


下面代码即可实现快进功能:

process->write(“seek <value> 1/n”);

4、音量调节

volume [abs]

Increase/decrease volume or set it to if [abs] is nonzero.


下面代码即可实现功能:

Process->write(“volume -1/n”);           //音量减小
Process->write(“volume +1/n”); //音量增加

5、静音功能

mute [value]

Toggle sound output muting or set it to [value] when [value] >= 0

(1 == on, 0 == off)


下面代码即可实现功能:

process->write("mute 0/n");         //开启静音
process->write("mute 1/n"); //关闭静音

6、定位视频窗口
通过上面的代码基本功能实现了,可是播放视频的时候发现又弹出一个窗口。并没有出现在我们的窗口里。
如下代码即可时间窗口的定位。

QString common = "mplayer -slave -quiet -ac mad -zoom movie/" + file_name + " -wid " + QString::number(widget->winId());
process->start(common);

Widget是一个QWidget对象。通过winId可以获得一个数字,-wid既将视频输出定位到widget窗体部件中。

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
process = new QProcess(this);
//process1 = new QProcess(this);

}

Widget::~Widget()
{
delete ui;
delete process;
}

void Widget::on_pushButton_clicked()
{

QStringList args;
args << "-slave"; //使用slave模式
args << "-quiet"; //不要输出冗余信息
args << "/home/pi/Videos/sample_640x360.mpg";
args << "-wid";
args << QString::number(ui->widget->winId());
qDebug()<<args;
process->start("mplayer", args); //启动该进程,并传入参数args
ui->pushButton->setDisabled(true);
}

void Widget::on_pushButton_2_clicked()
{
process->write("pause\n");
}

void Widget::on_pushButton_3_clicked()
{
process->write("seek 1 0\n");
}


void Widget::gettime()
{
process->write("get_time_pos\n");
QString str(process->readAll());
int index = str.indexOf("=");

QString str1 = str.mid(index+1);
float ff = str1.toFloat();
qDebug()<<ff;
}
void Widget::on_pushButton_4_clicked()
{
gettime();
}

mplayer
命令行使用

mkfifo /tmp/cmd
mplayer -slave -quiet -input file=/tmp/cmd xxx.mpeg &
#使用/tmp/cmd做为命令管道
echo "pause" > /tmp/cmd
mplayer [选项] [文件|URL|播放列表|]
mplayer [选项] 文件1 [分选项] [文件2] [分选项]
mplayer [选项] {文件和选项组} [组专用的分选项]
mplayer [dvd|dvdnav]://[标题|[开始标题]−结束标题] [选项]
mplayer vcd://曲目[/设备]
mplayer tv://[频道][/输入ID] [选项]
mplayer radio://[频道|频率][/捕捉设备] [选项]
mplayer pvr:// [选项]
mplayer dvb://[卡号@]频道 [选项]
mplayer mf://[文件掩码|@列表文件] [−mf 选项] [选项]
mplayer [cdda|cddb]://曲目[−结束曲目][:速度][/设备] [选项]
mplayer cue://文件[:曲目] [选项]
mplayer [file|mms[t]|http|http_proxy|rt[s]p|ftp|udp|unsv|smb]:// [用户名:密码@]URL[:端口] [选项]
mplayer sdp://文件 [选项]
mplayer mpst://主机[:端口]/URL [选项]
mplayer tivo://主机/[list|llist|fsid] [选项]
gmplayer [选项] [−skin 外观模板]
mencoder [选项] 文件 [文件|URL|] [−o 文件 | file://文件 | smb://[用户名:密码@]主机/文件路径]
mencoder [选项] 文件1 [分选项] [文件2] [分选项]

mplayer的控制指令:(−input cmdlist )

radio_step_channel   Integer
radio_set_channel String
radio_set_freq Float
radio_step_freq Float
seek Float [Integer] 跳到指定时间播放
edl_loadfile String
edl_mark
audio_delay Float [Integer]
speed_incr Float 快进
speed_mult Float
speed_set Float 设置指定时间
quit [Integer] 退出
stop
pause 暂停,再一次则重新播放
frame_step
pt_step Integer [Integer]
pt_up_step Integer [Integer]
alt_src_step Integer
loop Integer [Integer]
sub_delay Float [Integer]
sub_step Integer [Integer]
osd [Integer]
osd_show_text String [Integer] [Integer]
osd_show_property_te String [Integer] [Integer]
osd_show_progression
volume Float [Integer]
balance Float [Integer]
use_master
mute [Integer]
contrast Integer [Integer]
gamma Integer [Integer]
brightness Integer [Integer]
hue Integer [Integer]
saturation Integer [Integer]
frame_drop [Integer]
sub_pos Integer [Integer]
sub_alignment [Integer]
sub_visibility [Integer]
sub_load String
sub_remove [Integer]
vobsub_lang [Integer]
sub_select [Integer]
sub_source [Integer]
sub_vob [Integer]
sub_demux [Integer]
sub_file [Integer]
sub_log
sub_scale Float [Integer]
ass_use_margins [Integer]
get_percent_pos 取得百分比表示速度
get_time_pos 取得时间进度
get_time_length
get_file_name
get_video_codec
get_video_bitrate
get_video_resolution
get_audio_codec
get_audio_bitrate
get_audio_samples
get_meta_title
get_meta_artist
get_meta_album
get_meta_year
get_meta_comment
get_meta_track
get_meta_genre
switch_audio [Integer]
switch_angle [Integer]
switch_title [Integer]
tv_start_scan
tv_step_channel Integer
tv_step_norm
tv_step_chanlist
tv_set_channel String
tv_last_channel
tv_set_freq Float
tv_step_freq Float
tv_set_norm String
tv_set_brightness Integer [Integer]
tv_set_contrast Integer [Integer]
tv_set_hue Integer [Integer]
tv_set_saturation Integer [Integer]
forced_subs_only [Integer]
dvb_set_channel Integer Integer
switch_ratio [Float]
vo_fullscreen [Integer]
vo_ontop [Integer]
file_filter Integer
vo_rootwin [Integer]
vo_border [Integer]
screenshot [Integer]
panscan Float [Integer]
switch_vsync [Integer]
loadfile String [Integer]
loadlist String [Integer]
run String
capturing
change_rectangle Integer Integer
teletext_add_dec String
teletext_go_link Integer
overlay_add String Integer Integer Integer Integer
overlay_remove Integer
dvdnav String
menu String
set_menu String [String]
help
exit
hide [Integer]
get_vo_fullscreen
get_sub_visibility
key_down_event Integer
set_property String String
get_property String
step_property String [Float] [Integer]
seek_chapter Integer [Integer]
set_mouse_pos Integer Integer
af_switch String
af_add String
af_del String
af_clr
af_cmdline String String
gui String