六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 88|回复: 0

基于QT视频软件的开发和学习

[复制链接]

升级  0%

54

主题

54

主题

54

主题

举人

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2013-1-15 02:36:46 | 显示全部楼层 |阅读模式
马上工作需要做视频软件了,所以准备学习QT来开发,为什么选择QT呢,因为他优点多多(不说了自己网上g一下
        随着高清的不断普及,所有视频软件都向高清这个方向而前进,其中有一款开源跨平台的播放器vlc的特性和功能都是非
常的好,所以想准备学习vlc的源码来看看,在看他源码的时候,发现他还有一个可供开发人员调用的libvlc 媒体库可用(GPL),而vlc本身使用的GUI就是QT。
        好了不多说了
        先装好QT SDK,然后把环境变量设置一下(不会去G!)
        然后把vlc库加入到mingw里面
        先复制vlc-include.rar解压出来的头文件到Qt\2009.04\mingw\include里面
        在把vlc-lib.rar解压出来的文件放到C:\vlc-lib
        我们在 Qt Creator 里面建立一个空的QT项目
        新建一个Player类 ,会多出player.cpp,player.h 修改成如下
player.cpp
/*  * Flie Name  player.cpp */#include "player.h"#include <QVBoxLayout>#include <QPushButton>#include <QSlider>#include <QTimer>#include <QFrame>Player::Player(): QWidget(){    //preparation of the vlc command    const char * const vlc_args[] = {              "-I", "dummy", /* Don't use any interface */              "--ignore-config", /* Don't use VLC's config */              "--extraintf=logger", //log anything              "--verbose=2", //be much more verbose then normal for debugging purpose              "--plugin-path=C:\\vlc-0.9.9-win32\\plugins\\" };    _videoWidget=new QFrame(this);    _volumeSlider=new QSlider(Qt::Horizontal,this);    _volumeSlider->setMaximum(100); //the volume is between 0 and 100    _volumeSlider->setToolTip("Audio slider");    // Note: if you use streaming, there is no ability to use the position slider    _positionSlider=new QSlider(Qt::Horizontal,this);    _positionSlider->setMaximum(POSITION_RESOLUTION);    QVBoxLayout *layout = new QVBoxLayout;    layout->addWidget(_videoWidget);    layout->addWidget(_positionSlider);    layout->addWidget(_volumeSlider);    setLayout(layout);    _isPlaying=false;    poller=new QTimer(this);    //Initialize an instance of vlc    //a structure for the exception is neede for this initalization    libvlc_exception_init(&_vlcexcep);    //create a new libvlc instance    _vlcinstance=libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args,&_vlcexcep);  //tricky calculation of the char space used    raise (&_vlcexcep);    // Create a media player playing environement    _mp = libvlc_media_player_new (_vlcinstance, &_vlcexcep);    raise (&_vlcexcep);    //connect the two sliders to the corresponding slots (uses Qt's signal / slots technology)    connect(poller, SIGNAL(timeout()), this, SLOT(updateInterface()));    connect(_positionSlider, SIGNAL(sliderMoved(int)), this, SLOT(changePosition(int)));    connect(_volumeSlider, SIGNAL(sliderMoved(int)), this, SLOT(changeVolume(int)));    poller->start(100); //start timer to trigger every 100 ms the updateInterface slot}//desctructorPlayer::~Player(){    /* Stop playing */    libvlc_media_player_stop (_mp, &_vlcexcep);    /* Free the media_player */    libvlc_media_player_release (_mp);    libvlc_release (_vlcinstance);    raise (&_vlcexcep);}void Player::playFile(QString file){    //the file has to be in one of the following formats /perhaps a little bit outdated)    /*    [file://]filename              Plain media file    http://ip:port/file            HTTP URL    ftp://ip:port/file             FTP URL    mms://ip:port/file             MMS URL    screen://                      Screen capture    [dvd://][device][@raw_device]  DVD device    [vcd://][device]               VCD device    [cdda://][device]              Audio CD device    udp:[[<source address>]@[<bind address>][:<bind port>]]    */    /* Create a new LibVLC media descriptor */    _m = libvlc_media_new (_vlcinstance, file.toAscii(), &_vlcexcep);    raise(&_vlcexcep);    libvlc_media_player_set_media (_mp, _m, &_vlcexcep);    raise(&_vlcexcep);    // /!\ Please note /!\    //    // passing the widget to the lib shows vlc at which position it should show up    // vlc automatically resizes the video to the ´given size of the widget    // and it even resizes it, if the size changes at the playing    /* Get our media instance to use our window */    #if defined(Q_OS_WIN)        libvlc_media_player_set_drawable(_mp, reinterpret_cast<unsigned int>(_videoWidget->winId()), &_vlcexcep );        //libvlc_media_player_set_hwnd(_mp, _videoWidget->winId(), &_vlcexcep ); // for vlc 1.0    #elif defined(Q_OS_MAC)        libvlc_media_player_set_drawable(_mp, _videoWidget->winId(), &_vlcexcep );        //libvlc_media_player_set_agl (_mp, _videoWidget->winId(), &_vlcexcep); // for vlc 1.0    #else //Linux        libvlc_media_player_set_drawable(_mp, _videoWidget->winId(), &_vlcexcep );        //libvlc_media_player_set_xwindow(_mp, _videoWidget->winId(), &_vlcexcep ); // for vlc 1.0    #endif    raise(&_vlcexcep);    /* Play */    libvlc_media_player_play (_mp, &_vlcexcep );    raise(&_vlcexcep);    _isPlaying=true;}void Player::changeVolume(int newVolume){    libvlc_exception_clear(&_vlcexcep);    libvlc_audio_set_volume (_vlcinstance,newVolume , &_vlcexcep);    raise(&_vlcexcep);}void Player::changePosition(int newPosition){    libvlc_exception_clear(&_vlcexcep);    // It's possible that the vlc doesn't play anything    // so check before    libvlc_media_t *curMedia = libvlc_media_player_get_media (_mp, &_vlcexcep);    libvlc_exception_clear(&_vlcexcep);    if (curMedia == NULL)        return;    float pos=(float)(newPosition)/(float)POSITION_RESOLUTION;    libvlc_media_player_set_position (_mp, pos, &_vlcexcep);    raise(&_vlcexcep);}void Player::updateInterface(){    if(!_isPlaying)        return;    // It's possible that the vlc doesn't play anything    // so check before    libvlc_media_t *curMedia = libvlc_media_player_get_media (_mp, &_vlcexcep);    libvlc_exception_clear(&_vlcexcep);    if (curMedia == NULL)        return;    float pos=libvlc_media_player_get_position (_mp, &_vlcexcep);    int siderPos=(int)(pos*(float)(POSITION_RESOLUTION));    _positionSlider->setValue(siderPos);    int volume=libvlc_audio_get_volume (_vlcinstance,&_vlcexcep);    _volumeSlider->setValue(volume);}void Player::raise(libvlc_exception_t * ex){    if (libvlc_exception_raised (ex))    {         fprintf (stderr, "error: %s\n", libvlc_exception_get_message(ex));         exit (-1);    }} player.h
/* libVLC and Qt sample code * Copyright © 2009 Alexander Maringer <maringer@maringer-it.de> */#ifndef VLC_ON_QT_H#define VLC_ON_QT_H#include <vlc/vlc.h>#include <QWidget>class QVBoxLayout;class QPushButton;class QTimer;class QFrame;class QSlider;#define POSITION_RESOLUTION 10000class Player : public QWidget{    Q_OBJECT    QSlider *_positionSlider;    QSlider *_volumeSlider;    QFrame *_videoWidget;    QTimer *poller;    bool _isPlaying;    libvlc_exception_t _vlcexcep;    libvlc_instance_t *_vlcinstance;    libvlc_media_player_t *_mp;    libvlc_media_t *_m;public:    Player();    ~Player();    void raise(libvlc_exception_t * ex);public slots:    void playFile(QString file);    void updateInterface();    void changeVolume(int newVolume);    void changePosition(int newPosition);};#endif 在新建立一个main.cpp 修改成如下
 
#include <QtGui/QApplication>#include "player.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    Player p;    p.resize(640,480);    p.playFile("#填写你要播的文件路径#");     p.show();    return a.exec();} 然后我们修改  .pro文件 成如下
TARGET = test1TEMPLATE = appLIBS += -L'C:\vlc-lib'LIBS += -lvlcSOURCES += player.cpp \    main.cppHEADERS += player.h 然后运行qmake
然后就可以编译了
编译成功以后想要运行,还必须把C:\vlc-lib里面的libvlc.dll,和libvlccore.dll拷贝到生成exe的目录里面才能运行
现在在qt creator里面就可以运行了(单独运行还需要其它dll)
 
haha
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表