• 18047阅读
  • 11回复

有没有简易的、基于Mplayer开发的QT视频播放器? [复制链接]

上一主题 下一主题
离线mrchengdu
 
只看楼主 倒序阅读 楼主  发表于: 2008-10-15
— 本帖被 XChinux 执行加亮操作(2008-10-16) —
小弟现在正在国外做一个项目,需要用QT做一个简易的视频播放器。最好是基于Mplayer的。
只要实现播放,暂停,停止,前进,后退,音量,进度基本功能就可以了。

有没有类似的codes或者例子啊?

谢谢大家的帮助。

也欢迎大家交流 我的QQ 29421022

谢谢!!!一定不会亏待你的。呵呵
离线water_wf

只看该作者 1楼 发表于: 2008-10-16
smplayer,qt4  +qprocess + mplayer
离线mrchengdu
只看该作者 2楼 发表于: 2008-10-16
谢谢。

但是smplayer我看了,但是太复杂了。。

有没有那种很简易的播放器??
离线jssx
只看该作者 3楼 发表于: 2008-10-16
可以裁剪的呀
离线sun6255028
只看该作者 4楼 发表于: 2009-12-11

这是用Qt 开发的一个视频播放器, 采用phonon库

需要源码的GGMM请邮箱联系 sun6255028@gmail.com
QQ群:42850126注:Qt爱好者
[ 此帖被sun6255028在2011-04-20 11:38重新编辑 ]
离线sophia2009
只看该作者 5楼 发表于: 2009-12-25
4楼的,能不能把这个视频播放器的源码发上来一下呀?光贴一张图让我只能看着呀。。谢谢
离线john123
只看该作者 6楼 发表于: 2009-12-25





這只是一個class,是用gnu gpl發布

這有源碼可download,舊的程式碼寫的不好
新的源碼放上去了(v0.050是改寫過的)
http://sites.google.com/site/yplinlinux/

  1. #include "add_video.h"
  2. #include "ui_add_video.h"
  3. add_video::add_video(int i,QWidget *parent) :
  4.     QWidget(parent),
  5.     m_ui(new Ui::add_video)
  6. {
  7.    //i=0初始化空物件              play_id=0
  8.    //i=1初始化net radio          play_id=1
  9.    //i=2初始化net tv             play_id=2
  10.    //i=3初始化local music        play_id=3
  11.    //i=4初始化local video        play_id=4
  12.    //i=5初始化play cd            play_id=5
  13.     m_ui->setupUi(this);
  14.     play_id=0;           //play id
  15.     int_play_id=i;
  16.     is_start_play_local=true; //這是給按play後就設成false
  17.     connect_i=0;
  18.     play_music_number=0;
  19.     is_play_music=false;
  20.     is_play_video=false;
  21.     is_play_cd=false;
  22.     is_play_vcd=false;
  23.     this->set_lcd_color(4);
  24.     switch(i){
  25.         case 1:  //net radio
  26.         {
  27.           media = new Phonon::MediaObject;
  28.           Phonon::VolumeSlider *volumeSlider=new Phonon::VolumeSlider;
  29.           //volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  30.           //media->setCurrentSource(Phonon::MediaSource("./test.mpeg"));   //放mp3
  31.           Phonon::AudioOutput *aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
  32.           Phonon::createPath(media, aOutput);
  33.           volumeSlider->setAudioOutput(aOutput);
  34.           m_ui->horizontalLayout->addWidget(volumeSlider);
  35.           massageframe=new massage_frame;
  36.           m_ui->gridLayout_2->addWidget(massageframe);
  37.           is_play_music=false;
  38.           is_play_video=false;
  39.          break;}
  40. case 2:  //net tv
  41.         {
  42.            media = new Phonon::MediaObject;
  43.            Phonon::VolumeSlider *volumeSlider=new Phonon::VolumeSlider;
  44.            volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  45.           //media->setCurrentSource(Phonon::MediaSource("./test.mpeg"));   //放mp3
  46.            vwidget = new Phonon::VideoWidget(this);
  47.            vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
  48.            ///////////////////////////////////esc跳出全影幕///////////////////////////////////////////////
  49.          //vwidget->setShortcutEnabled(0,true);
  50.          QAction *at = new QAction(tr("&New"), vwidget);
  51.          vwidget->addAction(at);
  52.          vwidget->setAcceptDrops(true);
  53.          at->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Escape) << QKeySequence(Qt::Key_MediaStop));
  54.          connect(at, SIGNAL(triggered()), vwidget, SLOT(exitFullScreen()));
  55.          /////////////////////////////////////////////////////////////////////////////////////////////
  56.           Phonon::createPath(media, vwidget);
  57.           Phonon::AudioOutput *aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
  58.           Phonon::createPath(media, aOutput);
  59.           m_ui->gridLayout_2->addWidget(vwidget);
  60.           volumeSlider->setAudioOutput(aOutput);
  61.           Phonon::SeekSlider *seekSlider= new Phonon::SeekSlider;
  62.           seekSlider->setMediaObject(media);
  63.           m_ui->horizontalLayout->addWidget(seekSlider);
  64.           m_ui->horizontalLayout->addWidget(volumeSlider);
  65.           is_play_music=false;
  66.           is_play_video=false;
  67.          break;}
  68.   case 3:  //播放音樂
  69.         {
  70.          media = new Phonon::MediaObject;
  71.          Phonon::VolumeSlider *volumeSlider=new Phonon::VolumeSlider;
  72.          volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  73.          Phonon::AudioOutput *aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
  74.          Phonon::Path path = Phonon::createPath(media,aOutput);
  75.          //Phonon::createPath(media, aOutput);
  76.          volumeSlider->setAudioOutput(aOutput);
  77.          //volumeSlider->setStyleSheet("background-color: rgb(170, 85, 255)");
  78.          Phonon::SeekSlider *seekSlider= new Phonon::SeekSlider;
  79.          seekSlider->setMediaObject(media);
  80.          //seekSlider->setStyleSheet("background-color: rgb(170, 85, 255)");
  81.          //////////////effect/////////////////
  82.          //QList<Phonon::EffectDescription> effectDescriptions =Phonon::BackendCapabilities::availableAudioEffects();
  83.          //Phonon::EffectDescription effectDescription = effectDescriptions.at(4);
  84.          //Phonon::Effect *effect = new Phonon::Effect(effectDescription);
  85.          //path.insertEffect(effect);
  86.          //Phonon::EffectWidget *effectWidget = new Phonon::EffectWidget(effect);
  87.          //effectWidget->show();
  88.          m_ui->horizontalLayout->addWidget(seekSlider);
  89.          m_ui->horizontalLayout->addWidget(volumeSlider);
  90.          massageframe=new massage_frame;
  91.          m_ui->gridLayout_2->addWidget(massageframe);
  92.          is_play_music=true;
  93.          break;}
  94.   case 4:  //local video
  95.         {
  96.           media = new Phonon::MediaObject;
  97.           Phonon::VolumeSlider *volumeSlider=new Phonon::VolumeSlider;
  98.           volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  99.           //media->setCurrentSource(Phonon::MediaSource("./test.mpeg"));   //放mp3
  100.           vwidget = new Phonon::VideoWidget(this);
  101.           vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
  102.   ///////////////////////////////////esc跳出全影幕///////////////////////////////////////////////
  103.         // vwidget->setShortcutEnabled(0,true);
  104.          QAction *at = new QAction(tr("&New"), vwidget);
  105.          vwidget->addAction(at);
  106.          vwidget->setAcceptDrops(true);
  107.          at->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Escape) << QKeySequence(Qt::Key_MediaStop));
  108.          connect(at, SIGNAL(triggered()), vwidget, SLOT(exitFullScreen()));
  109. //////////////////////////////////////////////////////////////////////////////////////
  110. ;
  111.           Phonon::createPath(media, vwidget);
  112.           Phonon::AudioOutput *aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
  113.           Phonon::createPath(media, aOutput);
  114.           m_ui->gridLayout_2->addWidget(vwidget);
  115.           volumeSlider->setAudioOutput(aOutput);
  116.           Phonon::SeekSlider *seekSlider= new Phonon::SeekSlider;
  117.           seekSlider->setMediaObject(media);
  118.           m_ui->horizontalLayout->addWidget(seekSlider);
  119.           m_ui->horizontalLayout->addWidget(volumeSlider);
  120.           is_play_video=true;
  121.           break;}
  122.       case 6://play vcd
  123.           {
  124.           media = new Phonon::MediaObject;
  125.           Phonon::VolumeSlider *volumeSlider=new Phonon::VolumeSlider;
  126.           volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  127.           media->setCurrentSource(Phonon::Vcd);  //放cd
  128.           vwidget = new Phonon::VideoWidget(this);
  129.           vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto);
  130.              ///////////////////////////////////esc跳出全影幕///////////////////////////////////////////////
  131.          //vwidget->setShortcutEnabled(0,true);
  132.          QAction *at = new QAction(tr("&New"), vwidget);
  133.          vwidget->addAction(at);
  134.          vwidget->setAcceptDrops(true);
  135.          at->setShortcuts(QList<QKeySequence>() << QKeySequence(Qt::Key_Escape) << QKeySequence(Qt::Key_MediaStop));
  136.          connect(at, SIGNAL(triggered()), vwidget, SLOT(exitFullScreen()));
  137.          /////////////////////////////////////////////////////////////////////////////////////////////
  138.           Phonon::createPath(media, vwidget);
  139.           Phonon::AudioOutput *aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
  140.           Phonon::createPath(media, aOutput);
  141.           m_ui->gridLayout_2->addWidget(vwidget);
  142.           volumeSlider->setAudioOutput(aOutput);
  143.           Phonon::SeekSlider *seekSlider= new Phonon::SeekSlider;
  144.           seekSlider->setMediaObject(media);
  145.           m_ui->horizontalLayout->addWidget(seekSlider);
  146.           m_ui->horizontalLayout->addWidget(volumeSlider);
  147.           is_play_vcd=true;
  148.           break;}
  149.           case 5://play cd
  150.           {
  151.           media = new Phonon::MediaObject;
  152.           Phonon::VolumeSlider *volumeSlider=new Phonon::VolumeSlider;
  153.           volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
  154.           media->setCurrentSource(Phonon::Cd);  //放cd
  155.           Phonon::AudioOutput *aOutput = new Phonon::AudioOutput(Phonon::VideoCategory);
  156.           Phonon::createPath(media, aOutput);
  157.           volumeSlider->setAudioOutput(aOutput);
  158.           Phonon::SeekSlider *seekSlider= new Phonon::SeekSlider;
  159.           seekSlider->setMediaObject(media);
  160.           m_ui->horizontalLayout->addWidget(seekSlider);
  161.           m_ui->horizontalLayout->addWidget(volumeSlider);
  162.           is_play_cd=true;
  163.           break;}
  164.     }
  165.     if(i !=0){//非初始化空物件
  166.     QTimer *timer = new QTimer;
  167.     timer->start(1000);
  168.     connect(timer, SIGNAL(timeout()), this, SLOT(inf()));//一定要用this
  169.     }
  170. }
  171. void add_video::set_video_screen_model(int i)
  172. {
  173. if((play_id==2 or play_id==4 or play_id==6) ){
  174. switch(i)
  175.           {
  176.               case 1:
  177.               {
  178.                  vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatio16_9);
  179.                  break;
  180.                }
  181.               case 2:
  182.               {
  183.                  vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatio4_3);
  184.                  break;
  185.                }
  186.           }
  187. }
  188. }
  189. void add_video::set_full_screen()
  190. {
  191.     if((play_id==2 or play_id==4 or play_id==6) ){
  192.     this->vwidget->enterFullScreen();
  193.     }
  194. }
  195. void add_video::exit_full_screen()
  196. {
  197.     if(play_id==2 or play_id==4){
  198.     this->vwidget->exitFullScreen();
  199.     }
  200. }
  201. void add_video::stop_video()
  202. {
  203.     media->stop();
  204.     is_play_video=false;
  205.     is_play_music=false;
  206.     //if(is_start_play_local && is_play_music){play_music_number=0;}//local時按停止,重頭播放
  207. }
  208. void add_video::replay_video()
  209. {
  210.   if( play_id==3 || play_id==4)
  211.   {
  212.     media->stop();
  213.     media->setCurrentSource(media_local_list_source.at(0));
  214.     media->play();
  215.     play_music_number=0;                                       //local時按停止,重頭播放
  216.    }
  217. }
  218. void add_video::play_video()
  219. {
  220.       //開始播放且是play cd
  221.     if(is_start_play_local && (is_play_cd or is_play_vcd or is_play_music or is_play_video))
  222.     {
  223.         connect(media, SIGNAL(tick(qint64)), this, SLOT(tickk(qint64)));
  224.         is_start_play_local=false;
  225.     }
  226.     play_id=int_play_id; //按play才設play_id
  227.     media->play();
  228.     is_play_music=true;
  229. }
  230. void add_video::pause_video()
  231. {
  232.     media->pause();
  233. }
  234. void add_video::up_music()
  235. {
  236.     if(  this->get_play_music_number()>0 )
  237.     {
  238.        this->stop_video();
  239.        this->set_play_music_number(  this->get_play_music_number()-1);  //-1後設給 add_video  number
  240.        this->set_local_media_source( this->get_play_music_number()); //注意這不能減1,因為這是新的,設給 add_video  source
  241.        this->play_video();
  242.    }
  243. }
  244. void add_video::down_music()
  245. {
  246.     if( this->get_play_music_number() < this->get_play_music_total_number()-1 )
  247.     {
  248.        this->stop_video();
  249.        this->set_play_music_number(  this->get_play_music_number()+1);  //-1後設給 add_video  number
  250.        this->set_local_media_source( this->get_play_music_number()); //注意這不能減1,因為這是新的,設給 add_video  source
  251.        this->play_video();
  252.    }
  253. }
  254. //設net media source
  255. void add_video::set_video_source(QString str)
  256. {
  257.    media->setCurrentSource(Phonon::MediaSource(str));   //source
  258.    net_source_name=str;
  259. }
  260. //設local media source
  261. void add_video::set_local_media_source(int i)
  262. {
  263. this->media->setCurrentSource(this->media_local_list_source.at(i));
  264. }
  265. //取得當前歌曲編號
  266. int add_video::get_play_music_number()
  267. {
  268.     return this->play_music_number;
  269. }
  270. //取得當前歌曲總數
  271. int add_video::get_play_music_total_number()
  272. {
  273.     return this->media_local_list_source.size();
  274. }
  275. //設定當前歌曲編號
  276. void add_video::set_play_music_number(int i)
  277. {
  278.     this->play_music_number=i;
  279. }
  280. //clear media
  281. void add_video::clear_video()
  282. {
  283.     //已知一些DECORDER播放rm,用clear會有BUG
  284.    media->stop();
  285.    media->clearQueue();   //source
  286.    //media->clear();
  287.    media->disconnect();
  288. }
  289. /////////////////設定media source////////////////////////////////////////////
  290. void add_video::set_local_media_source(Phonon::MediaSource source)
  291. {
  292.    this->media->setCurrentSource(Phonon::MediaSource(source));   //source
  293. }
  294. //return play id
  295. int  add_video::get_play_id()
  296. {
  297.     return this->play_id;
  298. }
  299. ///retur current media
  300. bool add_video::is_media_Seekable()
  301. {
  302.     return this->media->isSeekable();
  303. }
  304. //set media source list
  305. void add_video::set_local_media_list(QList<Phonon::MediaSource> source)
  306. {
  307.         this->media_local_list_source=source;
  308. }
  309. bool add_video::is_local_play(){
  310.     if(play_id==3){return true;}else{return false;}
  311. }
  312. //設label
  313. void add_video::set_lable_text(QString str)
  314. {
  315.     m_ui->label->setText(str);
  316. }
  317. add_video::~add_video()
  318. {
  319.     delete m_ui;
  320. }
  321. void add_video::changeEvent(QEvent *e)
  322. {
  323.     QWidget::changeEvent(e);
  324.     switch (e->type()) {
  325.     case QEvent::LanguageChange:
  326.         m_ui->retranslateUi(this);
  327.         break;
  328.     default:
  329.         break;
  330.     }
  331. }
  332. void add_video::on_add_video_destroyed()
  333. {
  334.     this->close();
  335.     this->destroyed();
  336. }
  337. //////////////////////資訊slot,容易BUG要注意////////////////////////////////////////////////
  338. void add_video::inf()
  339. {
  340.              // connect(media, SIGNAL(bufferStatus(int)), this, SLOT(cache(int)));
  341.                bool wascaching = media->state() == Phonon::BufferingState;    //cache
  342.                bool wasplaying = media->state() == Phonon::PlayingState;      //play
  343.                bool wasconnecting = media->state() == Phonon::LoadingState;   //load
  344.                bool wasstoping = media->state() == Phonon::StoppedState;      //stop
  345.                bool waspauseing = media->state() == Phonon::PausedState;      //pause
  346.                bool waserroring = media->state() == Phonon::ErrorState;       //error
  347.                bool waserroring1 = media->errorType() == Phonon::NormalError;
  348.                bool waserroring2 = media->errorType() ==  Phonon::NoError;
  349.                bool waserroring3 = media->errorType() ==  Phonon::FatalError;
  350.                //Phonon::State newState;
  351.                if ( wascaching || wasplaying  || wasstoping || waspauseing || waserroring )
  352.                {
  353.                 if (wasplaying)
  354.                    {
  355.                        //歌曲名稱
  356.                       QString state_str=QString::fromUtf8(" 播放中........");
  357.                        m_ui->label->setText(state_str);
  358.                          if(play_id ==1){
  359.                          QString state_str=QString::fromUtf8("正在收聽 : \n");
  360.                          QString s=net_source_name;//source url name
  361.                          state_str.append(s);
  362.                          massageframe->set_lable_text(state_str);
  363.                        }
  364.                        if(is_play_music && play_id == 3){
  365.                        QString state_str=QString::fromUtf8("正在播放 : \n");
  366.                        QString s=media_local_list_source.at(play_music_number).fileName();
  367.                        emit set_music_tab(play_music_number);//發送信號,當前第幾首
  368.                        state_str.append(s);
  369.                        massageframe->set_lable_text(state_str);
  370.                        }
  371.                        if(is_play_music && play_id == 4){
  372.                        emit set_music_tab(play_music_number);//發送信號,當前第幾首
  373.                        }
  374.                    }
  375.                if (wascaching)
  376.                    {
  377.                        connect(media, SIGNAL(bufferStatus(int)), this, SLOT(cache(int)));
  378.                    }
  379.                if (wasstoping)
  380.                    {
  381.                         QString  str=QString::number(media_local_list_source.size());
  382.                         QString  str1=QString::number(play_music_number);
  383.                         QString state_str=QString::fromUtf8("播放停止 ........");
  384.                         state_str.append(str);
  385.                         state_str.append(" : ");
  386.                         state_str.append(str1);
  387.                         m_ui->label->setText(state_str);
  388.                         if((play_id==3&& is_play_music) or(is_play_video && play_id==4)){
  389.                         play_music_number++;
  390.                         if(play_music_number+1 > media_local_list_source.size() )
  391.                         {media->stop();play_music_number=0;is_play_music=false;}                                   //停止
  392.                         else{
  393.                         media->setCurrentSource(media_local_list_source.at(play_music_number));//指定source
  394.                         media->play();
  395.                         is_play_music=true;
  396.                        }
  397.                     }
  398.                    }
  399.                if (waspauseing)
  400.                    {
  401.                        QString state_str=QString::fromUtf8("播放暫停 ........");
  402.                         m_ui->label->setText(state_str);
  403.                    }
  404.                if (waserroring )
  405.                    {
  406.                        QString state_str=QString::fromUtf8("連接錯誤,可能是重複太多play........");
  407.                         m_ui->label->setText(state_str);
  408.                    }
  409.            }
  410.                else
  411.                {
  412.                  if (waserroring2)
  413.                    {
  414.                         connect_i++;
  415.                         QString  str=QString::number(connect_i);
  416.                         QString state_str;
  417.                         if( connect_i< 120)
  418.                            {
  419.                          state_str=QString::fromUtf8("連接中,請耐心等待, ........");
  420.                     }else{
  421.                          state_str=QString::fromUtf8("連接不上,可能是網路塞車或網址不對,試其他位置看看.");
  422.                     }
  423.                         state_str.append(str);
  424.                         m_ui->label->setText(state_str);
  425.                    }
  426.                }
  427. }
  428. void add_video::cache(int i)
  429. {
  430.    QString  str=QString::number(i);
  431.    QString state_str=QString::fromUtf8("%連接緩衝中 ........");
  432.    m_ui->label->setText(str.append(state_str));
  433. }
  434. /////////////////LCD TIME/////////////////////////////////
  435. void add_video::tickk(qint64 t)
  436. {
  437.      QTime displayTime(0, (t / 60000) % 60, (t / 1000) % 60);
  438.       m_ui->lcdNumber->display(displayTime.toString("mm:ss"));
  439. }
  440. //設定lcd time style///////////////////////////////////////////
  441. void add_video::set_lcd_color(int i){
  442.      //QRadialGradient gradient(50,50, 50, 50, 50);
  443.      //gradient.setColorAt(0, QColor::fromRgbF(0, 1, 0, 1));
  444.      //gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));
  445.      //gradient.setColorAt(0, Qt::blue);
  446.      //QBrush brush(gradient); //筆刷
  447.      QPalette palette;
  448.      switch(i)
  449.      {
  450.           case 1:palette.setBrush(QPalette::Light, Qt::cyan);break;
  451.           case 2:palette.setBrush(QPalette::Light, Qt::darkCyan);break;
  452.           case 3:palette.setBrush(QPalette::Light, Qt::darkRed);break;
  453.           case 4:palette.setBrush(QPalette::Light, Qt::black);break;
  454.           case 5:palette.setBrush(QPalette::Light, Qt::darkYellow);break;
  455.           case 6:palette.setBrush(QPalette::Light, Qt::darkMagenta);break;
  456.      }
  457.      //palette.setBrush(QPalette::Light, Qt::cyan);//Qt::darkCyan//Qt::darkRed//Qt::black//Qt::red//Qt::cyan
  458.      //palette.setBrush(QPalette::Light, brush);
  459.      m_ui->lcdNumber->setPalette(palette);
  460.     /////////////////////////////////////////////////////////////////
  461. }
[ 此帖被john123在2009-12-26 17:24重新编辑 ]
离线sophia2009
只看该作者 7楼 发表于: 2009-12-25
楼上的,真是大好人呀,先编译试试看。万分感谢
离线john123
只看该作者 8楼 发表于: 2009-12-25
那個只是一個類(class)而已,上面那個我已用GNU GPL發布了

源碼在這
http://sites.google.com/site/yplinlinux/
[ 此帖被john123在2009-12-25 17:41重新编辑 ]
离线wuhsn

只看该作者 9楼 发表于: 2009-12-29
用QT自带的phonon不就可以吗,源码demo里面就有啊。
离线smile__lv

只看该作者 10楼 发表于: 2010-08-13
6楼 那个连接不行啊  其他朋友试试 能打开吗 我的 带不开 360提示 找不到服务器
离线yulitingfeng
只看该作者 11楼 发表于: 2011-05-21
你好强大啊。。。直接给贴出来了、、、
快速回复
限100 字节
 
上一个 下一个