QT学习_视频播放

Posted Leslie X徐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT学习_视频播放相关的知识,希望对你有一定的参考价值。

QT播放媒体

在这里插入图片描述

使用MediaPlayer

QT5版本以上使用

使用Phonon

QT4版本使用

  1. 单独使用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();
    
  1. 常用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


以上是关于QT学习_视频播放的主要内容,如果未能解决你的问题,请参考以下文章

Qt 视频播放器

QT学习笔记——实现简单的视频播放器

QT学习笔记—— 实现①从本地选择播放源②连接数据库③带有播放列表的视频播放器

如何在片段中播放视频

QT学习笔记——①进度条可拖动点击②有暂停按钮 的视频播放器

使用 Qt 播放实时视频流