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