`
wan_2004
  • 浏览: 140427 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

    博客分类:
  • C++
阅读更多

马上工作需要做视频软件了,所以准备学习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
}

//desctructor
Player::~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 10000

class 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 = test1
TEMPLATE = app
LIBS += -L'C:\vlc-lib'
LIBS += -lvlc
SOURCES += player.cpp \
    main.cpp
HEADERS += player.h

 然后运行qmake

然后就可以编译了

编译成功以后想要运行,还必须把C:\vlc-lib里面的libvlc.dll,和libvlccore.dll拷贝到生成exe的目录里面才能运行

现在在qt creator里面就可以运行了(单独运行还需要其它dll)

 

haha

  • vlc.rar (29.5 KB)
  • 下载次数: 186
5
0
分享到:
评论

相关推荐

    基于QT的视频监控系统

    【基于QT的视频监控系统】是一种使用QT框架开发的实时监控应用。QT是一个跨平台的C++库,它为开发者提供了丰富的图形用户界面(GUI)工具包,支持多种操作系统,如Windows、Linux、macOS等。这个视频监控系统利用QT...

    基于QT5的视频桌面软件代码

    综上所述,基于QT5.12的视频桌面软件是一个集成了多媒体处理、用户交互、系统集成等多种技术的复杂项目,对于学习和理解Qt框架以及多媒体编程具有很高的实践价值。通过深入研究和理解这些知识点,开发者可以提升自己...

    基于Qt的视频监控源代码

    "基于Qt的视频监控源代码"指的是使用Qt框架开发的视频监控系统的原始编程代码。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++语言,同时也提供了QML进行UI设计。在视频监控领域,Qt...

    基于Qt开发平台,利用linux下视频采集驱动V4L2,实现视频的采集

    在本项目中,我们将基于Qt开发平台,结合V4L2驱动,来实现视频的实时采集和帧数据的保存。 首先,Qt是一个跨平台的C++图形用户界面应用程序框架,它提供了丰富的库和工具,使得开发者可以在不同操作系统上构建用户...

    基于QT的简易视频播放器

    【基于QT的简易视频播放器】是一个利用QT框架开发的简单视频播放软件。QT是一个流行的开源C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得开发者能够轻松创建跨平台的应用程序,包括多媒体应用。在...

    qt制作的视频通话,实现双向视频电话

    作为一个开源项目,这个视频通话工具的源代码可供学习和改进。开发者可以借此理解如何在Qt环境下集成网络通信与多媒体处理,为自己的项目提供参考。 总的来说,这个“Qt制作的视频通话”项目展示了Qt库在开发高效、...

    基于qtc++的图像处理软件设计.rar

    在本项目中,我们探讨的是一个基于QTC++和OpenCV的图像处理软件设计。QTC++,全称为Qt C++,是Qt框架与C++语言的结合,它提供了一个全面的工具集,用于开发跨平台的图形用户界面应用程序。而OpenCV(开源计算机视觉...

    Qt5开发实例在线视频二维码.rar

    【Qt5开发】是计算机软件开发领域中的一个重要主题,它是一个跨平台的C++图形用户界面应用程序开发框架。Qt5由The Qt Company开发并维护,广泛应用于桌面、移动设备和嵌入式系统的应用开发。本资源集合是针对Qt5开发...

    基于QT以及FFmpeg开发的录屏软件以及视频播放器代码

    【QT与FFmpeg技术概述】 ...深入研究这个"project"文件,我们可以学习到如何在实际项目中结合QT和FFmpeg,实现录屏和播放器的完整流程,这对于理解多媒体处理和跨平台应用开发具有很高的参考价值。

    Qt 5.9 C++开发指南-Qt核心特点源码

    **Qt 5.9 C++ 开发指南:深入...深入理解其核心特点和源码,将使你能够更好地利用Qt进行软件开发,创建出高效、美观的应用程序。通过实践与学习,你将成为一名精通Qt 5.9的开发者,能够应对各种复杂的软件工程挑战。

    基于QT的跨平台视频编辑软件源代码.zip

    【标题】: "基于QT的跨平台视频编辑软件源代码" 这个标题暗示了我们讨论的...以上内容涵盖了从QT开发到视频编辑软件实现的多个技术领域,对于想要学习和开发跨平台视频编辑软件的开发者来说,这些都是宝贵的学习资源。

    基于Qt QGraphicsView的简易画图软件.zip

    Qt技术是一套强大的跨平台应用程序开发框架,专注于使用C++语言来构建高性能、高可维护性的软件解决方案。自1991年首次推出以来,Qt因其卓越的跨平台能力、丰富的功能集、高效的开发工具和良好的社区支持而广受...

    QT音视频开发工作要求.docx

    2. 图形化编程软件开发:该职责要求开发者能够基于 QT 开发图形化编程软件,能够满足产品需求。 3. 相关代码编写和产品化文档编写:该职责要求开发者能够编写高质量的代码和产品化文档,能够满足产品需求。 4. 架构...

    基于QT的网络视频直播软件.zip

    【标题】基于QT的网络视频直播...总的来说,基于QT的网络视频直播软件开发涉及网络通信、多媒体处理、图形渲染等多个技术领域,通过学习和实践,开发者不仅可以掌握QT框架的使用,还能提升在实时流媒体领域的专业技能。

    基于QT电子相册

    【基于QT电子相册】是一个使用QT框架开发的简易电子相册应用,它在培训过程中被创建,并且作为学习和实践的示例项目。虽然功能可能并不完善,但其核心特性在于能够遍历指定目录下的所有图片并进行展示,这为理解和...

    QT视频监管平台

    QT视频监管平台是一款基于Qt库开发的视频监控系统,它提供了强大的视频监控、管理和分析功能。Qt是一个跨平台的应用程序开发框架,支持多种操作系统,如Windows、Linux、macOS等,使得开发人员能够构建高性能、用户...

    基于Qt5音视频播放器

    【基于Qt5音视频播放器】是一个利用Qt5框架开发的多媒体播放软件。Qt5是Qt库的一个版本,它提供了一套丰富的C++工具包,用于构建跨平台的图形用户界面应用程序。Qt5包含了多种模块,如Widgets、Core、Network、Gui等...

    精选_基于QT与mplayer的视频播放器_源码打包

    【标题】"精选_基于QT与mplayer的视频播放器_源码打包"指的是一个开源项目,它将流行的跨平台图形用户界面库Qt与强大的多媒体播放引擎mplayer结合,创建了一个功能丰富的视频播放器。这个源码打包资源是为开发者提供...

Global site tag (gtag.js) - Google Analytics