zoukankan      html  css  js  c++  java
  • Qt编写视频播放器(vlc内核)

    在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外。用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情,最好加点美化那就更加完美了,市面上很多播放器是vlc内核写的,或者ffmpeg写的。
    执行文件下载:https://pan.baidu.com/s/1KHTsgQUvtzWa3rLB_Tmo7A 

    1:多线程实时播放rtsp视频流
    2:支持windows+linux+mac
    3:多线程显示图像,不卡主界面
    4:自动重连网络摄像头
    5:可设置边框大小即偏移量和边框颜色
    6:可设置是否绘制OSD标签即标签文本或图片和标签位置
    7:可设置两种OSD位置和风格
    8:可设置是否保存到文件以及文件名
    9:可播放本地视频文件,支持设置帧率
    10:支持h265视频流+rtmp等常见视频流
    11:可暂停播放和继续播放
    12:支持回调模式和句柄两种模式
    13:自动将当前播放位置和音量大小是否静音以信号发出去
    14:提供接口设置播放位置和音量及设置静音

    #ifndef VLCTHREAD_H
    #define VLCTHREAD_H
    
    #include <QThread>
    
    class QLabel;
    class libvlc_instance_t;
    class libvlc_media_t;
    class libvlc_media_player_t;
    
    class VlcThread : public QThread
    {
        Q_OBJECT
    public:
        enum VlcState {
            VlcState_NothingSpecial = 0,
            VlcState_Opening = 1,
            VlcState_Buffering = 2,
            VlcState_Playing = 3,
            VlcState_Paused = 4,
            VlcState_Stopped = 5,
            VlcState_Ended = 6,
            VlcState_Error = 7
        };
    
        explicit VlcThread(QObject *parent = 0);
        ~VlcThread();
    
    protected:
        void run();
    
    private:
        bool stopped;           //停止线程标志位
        bool isPlayVideo;       //开始播放标志位
        bool isPauseVideo;      //暂停播放标志位
        bool isStopVideo;       //停止播放标志位
        bool isReadPosition;    //读取当前位置标志位
    
        QLabel *lab;            //显示播放视频标签
        QString fileName;       //文件名称
        QString suffix;         //文件拓展名
    
        libvlc_instance_t *vlcInst;
        libvlc_media_t *vlcMedia;
        libvlc_media_player_t *vlcPlayer;
    
    public:
        //获取文件名称
        QString getFileName()   const;
        //获取拓展名
        QString getSuffix()     const;
    
    private slots:
        //读取文件长度
        void readLength();
        //获取当前位置
        void readPosition();
    
        //开始播放
        void playVideo();
        //暂停播放
        void pauseVideo();
        //停止播放
        void stopVideo();
    
    signals:
        //开始播放信号
        void playStart();
        //停止播放信号
        void playStop();
        //暂停播放信号
        void playPause();
    
        //当前播放时长
        void filePositionReceive(uint position, bool isPlay);
        //总时长
        void fileLengthReceive(uint length);
        //音量大小
        void fileVolumeReceive(int volume, bool mute);
    
    public slots:
        //设置要播放的载体
        void setWidget(QLabel *lab);
        //设置文件
        void setFileName(const QString &fileName);
    
        //设置vlc参数
        void setOption(const QString &args);
    
        //设置缓存时长,单位毫秒
        void setDelayTime(int delayTime);
    
        //设置保存录像文件
        void save(const QString &videoFilePath);
    
        //设置视频宽高比例
        void setWidthHeight(int width, int height);
    
        //设置显示图片
        void setImage(QLabel *lab, const QString &fileName, int width, int height);
    
    
        //播放
        void play();
        //暂停
        void pause();
        //停止
        void stop();
        //停止线程
        void stopAll();
    
        //保存快照
        void snapshot(const QString &imageFilePath);
    
        //检测是否活着
        bool getIsPlaying();
        //获取当前状态
        VlcState getStatus();
    
        //获取长度
        uint getLength();
        //获取当前播放位置
        uint getPosition();
        //设置播放位置
        void setPosition(int position);
    
        //获取静音状态
        bool getMute();
        //设置静音
        void setMute(bool mute);
    
        //获取音量
        int getVolumn();
        //设置音量
        void setVolumn(int volumn);
    
        //获取音轨
        int getTrack();
        //获取音轨数量
        int getTrackCount();
        //设置音轨
        void setTrack(int track);
    
    };
    
    #endif // VLCTHREAD_H
    

      

  • 相关阅读:
    browser-sync events.js:85 throw er; // Unhandled 'error' event
    js判断页面放大缩小
    uniapp小实例-新闻列表及详情
    uniapp 分享接口
    uniapp--第三方登录 小程序登录
    vue h5转换uni-app指南(vue转uni、h5转uni)
    uniapp详解及配置
    uniapp快速上手
    Vuex 的项目实例11 列表数据的按需切换
    Vuex 的项目实例10 底部按钮高亮切换
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/9340810.html
Copyright © 2011-2022 走看看