Qt + FFmpeg 视频播放器

本文介绍了如何利用Qt与FFmpeg搭建环境,包括下载和加载库的步骤。接着详细阐述了如何实现一个视频播放器,包括音视频播放、调节音量、跳转进度、弹幕功能。通过音视频操作流程图展示了读取和解码过程,并提供了源码链接。文章还探讨了弹幕功能的两种实现方式,一种使用FFmpeg的avfilter,另一种采用XML存储并使用QPainter绘制。最后,文章展示了展示窗体的关键代码和整体工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 环境搭建

1. 下载

QT:window 5.7.0版本
FFmpeg: ffmpeg-20200522-38490cb-win32-dev
注意:这里下载 32位dev版本,要和编译器对应(我的mingw是32位的)

2. 加载库

在FFmpeg的解压目录里

  1. include/ 的头文件拷贝到自己的项目的工程路径下
  2. lib/ 拷贝所需要的库到自己的项目里

#这里是我所用到的库和 pro里的配置

//avcodec-58.dll
//avdevice-58.dll
//avfilter-7.dll
//avformat-58.dll
//avutil-56.dll
//potproc-55.dll
//swresample-3.dll
//swscale-5.dll

INCLUDEPATH += $$PWD/include/

LIBS += -L$$PWD/lib -lavutil-56 -lavformat-58 -lavcodec-58 -lavdevice-58 -lavfilter-7 -lpostproc-55 -lswresample-3 -lswscale-5

#到这里配置就完成了

二、实战演练

1. 功能介绍

源码链接: https://github.com/AutoCatFuuuu/QT/tree/master/ffmpeg

  1. 音视频播放
  2. 调节音量,跳转进度
  3. 支持弹幕功能
实际效果图

4分屏视频播放
在这里插入图片描述

2. 音视频操作流程图

FFmpeg操作流程图AFFmepg.h

[AFFmpeg类] 音视频操作功能封装
操作流程:

  1. open();
    打开音视频文件
    读取音视频流
    读取音视频的解码器
    初始化音视频的缓存区
    获取音视频的时长,时基
  2. readVideo(); readAudio();
    解码音视频流
  3. getFrame(); getAudio();
    读取解码后的音视频流数据
  4. seek();
    跳转音视频流
  5. getDeviation();
    计算当前音视频帧的时间差
    ===========================================
    在open()成功之后开始两个定时器分别执行
    <1> readVideo() getFrame() [视频]
    <2> readAudio() getAudio() [音频]
    即可。
#ifndef AFFMPEG_H
#define AFFMPEG_H

#ifdef __cplusplus
extern "C"{
   
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include "libswresample/swresample.h"
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include <pthread.h>
}
#endif

#include "afilter.h"

class AFFmpeg
{
   
public:
    AFFmpeg();
    ~AFFmpeg();
    bool open(const char* filepath,bool isaudio = true);//打开文件
    int readVideo();                                    //读取视频
    int readAudio();                                    //读取音频
    int seek(float pos);                                //跳转
    AVFrame* getFrame(){
    return pVideoFrameRGB;}        //读取图像
    int getAudio(char **buf);                           //读取音频
    int getDuration(){
    return duration;}                //获取总时长
    double getCDuration(){
    return cduration;}           //获取当前时长
    int getFPS() {
    return fps.num;}                     //获取帧率
    double getDeviation();                              //获取当前视频和音频的时差
    void setAFilterOpen() {
    isAFilteropen = !isAFilteropen; } //弹幕开关
private:
    //视频相关
    AVFormatContext     *pFormatContext;    //文件内容相关信息

    AVCodecContext      *pVideoCodecContext;//编码信息
    AVCodec             *pVideoCodec;       //解码器
    AVFrame             *pVideoFrame;       //一帧视频 源
    AVFrame             *pVideoFrameRGB;    //一帧视频 RGB格式
    AVRational          fps;                //帧率
    struct SwsContext   *pSwsContext;       //转换格式用的结构体
    unsigned char       *out_buffer;        //数据流初始化用的
    int                 videoindex;         //视频流索引
    AVPacket           *pVCPacket
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值