天天看點

QT學習_視訊播放

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);      
#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();
}      
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] [分選項]      
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