VLC使用

本文主要介绍windows下vlc使用:
1、vlc下载
通过https://download.videolan.org/pub/videolan/vlc/链接进行下载dll库
在这里插入图片描述
主要使用以下文件
在这里插入图片描述
2、测试代码

  • 头文件
#ifndef MYPLAYER_H
#define MYPLAYER_H

#include <QObject>

#include"vlc/vlc.h"
class MyPlayer:public QObject
{
    Q_OBJECT
public:
    explicit MyPlayer(QObject *parent = 0);
    int     play(const QString fileName, void* hwnd = nullptr);
    int     play();
    void    pause();
    void    stop();
    void    setVolume(int nVol);
    int     getVolume();
    void    seekTo(float nPos);
    bool    isPlaying();
    bool    isPause();
    int     getPos();
    int64_t getTime();
    int64_t getPlayTime();
    void    setPlayTime(int64_t time);
    int     getPlayState();
    void    release();

private:
    libvlc_instance_t     *m_pInst;     // VLC实例
    libvlc_media_player_t *m_pPlayer;   // VLC播放器
    libvlc_event_manager_t *m_pEventMg; //VLC事件
};

#endif // MYPLAYER_H

  • cpp文件
#include "VLCPlayer.h"
#include <QFile>
#include <QDebug>
static void handleEvents(const libvlc_event_t *event, void *userData)
{
    //获取player句柄
    MyPlayer* obj = (MyPlayer*)userData;
    switch (event->type) {
    //播放中
    case libvlc_MediaPlayerPlaying:{
        break;
    }
        // media player 位置改变
    case libvlc_MediaPlayerPositionChanged: {
        qDebug() << "player position is: " << event->u.media_player_position_changed.new_position ;
        break;
    }
        // media player 时间改变
    case libvlc_MediaPlayerTimeChanged: {
        qDebug() << "New Time is: " << event->u.media_player_time_changed.new_time ;
        break;
    }
    default:
        break;
    }
}

MyPlayer::MyPlayer(QObject *parent) : QObject(parent)
{
    m_pPlayer = nullptr;
    m_pInst = libvlc_new(0, nullptr);
}
int MyPlayer::play(const QString fileName, void* hwnd)
{
    int nRet = -1;
    if (!QFile::exists(fileName)) {
        qDebug()<<"file is not exist:"<<fileName;
        return nRet ;
    }
    if (this->isPlaying())
    {
        this->stop();

    }
    libvlc_media_t *media;
    media = libvlc_media_new_path(m_pInst, fileName.toStdString().data());
    if (!media)
    {
        return nRet;
    }
    m_pPlayer = libvlc_media_player_new_from_media(media);
    if (!m_pPlayer)
    {
        return nRet;
    }
    libvlc_media_release(media);
    m_pEventMg = libvlc_media_player_event_manager(m_pPlayer);
    libvlc_event_attach(m_pEventMg,libvlc_MediaPlayerPositionChanged,handleEvents,this);
    libvlc_event_attach(m_pEventMg, libvlc_MediaPlayerTimeChanged, handleEvents, this);
    libvlc_event_attach(m_pEventMg, libvlc_MediaPlayerPlaying, handleEvents, this);
    if(hwnd != nullptr)
    {
        libvlc_media_player_set_hwnd(m_pPlayer, hwnd);
    }
    nRet = 0;
    this->play();

    return nRet;
}

int MyPlayer::play()
{
    int nRet = -1;
    if (m_pPlayer)
    {
        nRet = libvlc_media_player_play(m_pPlayer);
    }
    return nRet;
}

void MyPlayer::pause()
{
    if (m_pPlayer)
    {
        libvlc_media_player_pause(m_pPlayer);
    }
}

void MyPlayer::stop()
{
    if (m_pPlayer)
    {
        if(getPlayState() != libvlc_Ended){
            libvlc_media_player_pause(m_pPlayer);
            libvlc_media_player_stop(m_pPlayer);
        }
        libvlc_media_player_release(m_pPlayer);
        m_pPlayer = nullptr;
    }
}

void MyPlayer::setVolume(int nVol)
{
    if (m_pPlayer)
    {
        libvlc_audio_set_volume(m_pPlayer, nVol);
    }
}

int MyPlayer::getVolume()
{
    int nRet = 0;
    if (m_pPlayer)
    {
        nRet =  libvlc_audio_get_volume(m_pPlayer);
    }
    return nRet;
}

void MyPlayer::seekTo(float nPos)
{
    if (m_pPlayer)
    {
        libvlc_media_player_set_position(m_pPlayer, nPos);
    }
}

bool MyPlayer::isPlaying()
{
    bool bRet = false;
    if (m_pPlayer)
    {
        bRet =  libvlc_media_player_is_playing(m_pPlayer);
    }
    return bRet;
}

bool MyPlayer::isPause()
{
    bool bRet = false;
    if (!m_pPlayer)
    {
        return bRet;
    }
    int state = libvlc_media_player_get_state(m_pPlayer);
    switch (state)
    {
    case libvlc_Paused:
    case libvlc_Stopped:
        bRet = true;
        break;
    default:
        break;
    }

    return bRet;
}

int MyPlayer::getPos()
{
    int nRet = 0;
    if (m_pPlayer)
    {
        nRet = (int)(100 * libvlc_media_player_get_position(m_pPlayer));
    }
    return nRet;
}

int64_t MyPlayer::getTime()
{
    int nRet = 0;
    if (m_pPlayer)
    {
        nRet = libvlc_media_player_get_length(m_pPlayer);
    }
    return nRet;
}

int64_t MyPlayer::getPlayTime()
{
    int nRet = 0;
    if (m_pPlayer)
    {
        nRet = libvlc_media_player_get_time(m_pPlayer);
    }
    return nRet;
}

void MyPlayer::setPlayTime(int64_t time)
{
    if (m_pPlayer)
    {
        libvlc_media_player_set_time(m_pPlayer, time);
    }
}

int MyPlayer:: getPlayState()
{
    int nRet = 0;
    if (m_pPlayer) {
        nRet = libvlc_media_player_get_state(m_pPlayer);
    }
    return nRet;
}
void MyPlayer::release()
{
    if (m_pPlayer)
    {
        libvlc_media_player_stop(m_pPlayer);
        libvlc_media_player_release(m_pPlayer);
        m_pPlayer = nullptr;
    }
    if (m_pInst)
    {
        libvlc_release(m_pInst);
        m_pInst = nullptr;
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值