• QT学习_视频播放


    在这里插入图片描述
    使用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
    
    
    
    
  • 相关阅读:
    Linux 文件特殊权限
    Linux ACL权限
    Linux 用户管理命令
    Asm.js: Javascript的编译目标
    《Zero to One》的一些读书笔记
    Tomcat架构(四)
    Tomcat架构(三)
    Tomcat架构(二)
    Tomcat 架构 (一)
    MATERIAL DESIGN学习笔记
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16334956.html
Copyright © 2020-2023  润新知