1. 程式人生 > 其它 >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);

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