标题:Qt开源作品1-视频流播放ffmpeg内核
作者:liudianwu
日期:2020-04-24 15:28
内容:
## 一、前言
好久以前就写过这个工具,后来因为Qt版本的不断升级以及ffmpeg也经历过好多次的迭代,可能从官网下载的ffmpeg搭配原来的代码不能正确编译,因为很多api已经变了,所以这次特意抽空全部整理重写一遍,只求最精简最好用,同时兼容了ffmpeg3和ffmpeg4,并且同时支持32位的库和64位的库,这样任何小白拿过去直接编译就能用。
1. 多线程实时绘制
2. 同时解码视频流和音频流
3. 支持任意Qt版本任意系统任意编译器
4. 解码和窗体分离,拓展性强
5. 可选ffmpeg3和ffmpeg4两个版本
6. 可选32位和64位的ffmpeg库
7. 注释绝对详细,包你满意
## 二、代码思路
第一步:引入ffmpeg的头文件
```c++
//必须加以下内容,否则编译不能通过,为了兼容C和C99标准
#ifndef INT64_C
#define INT64_C
#define UINT64_C
#endif
//引入ffmpeg头文件
extern "C" {
#include "libavutil/opt.h"
#include "libavutil/time.h"
#include "libavutil/frame.h"
#include "libavutil/pixdesc.h"
#include "libavutil/avassert.h"
#include "libavutil/imgutils.h"
#include "libavutil/ffversion.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
#ifdef ffmpegdevice
#include "libavdevice/avdevice.h"
#endif
#ifndef gcc45
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext_qsv.h"
#endif
}
```
第二步:注册ffmpeg的库
这里发现很多人每个类都注册一次,搞得内存每次增加很多,不是不可以,而是没有必要,其实ffmpeg的库和解码器等,在一个程序中只需要注册一次即可,没必要每个视频类都注册一次。
```c++
//一个软件中只需要初始化一次就行
void FFmpegThread::initlib()
{
static QMutex mutex;
QMutexLocker locker(&mutex);
static bool isInit = false;
if (!isInit) {
//注册库中所有可用的文件格式和解码器
av_register_all();
  ..
#1 [dxa572862121 05-08 20:26]
初学Qt,作者厉害
#2 [gospite 05-09 14:01]
#3 [bishechongya 05-11 20:48]
使用QT5.9+MINGW32bit进行运行,提示我:
Starting D:\ffmepgdemo\QWidgetDemo\bin\ffmpegdemo.exe...
00:24:56 194 init ffmpeg lib okversion: 3.4.5
00:26:20 678 open input error "rtsp://admin:Admin123456@192.168.1.64:554/Streaming/Channels/102?transportmode=unicast&profile=Profile_2"
程序异常结束。
D:\ffmepgdemo\QWidgetDemo\bin\ffmpegdemo.exe crashed.
没有开影子构建,请问是哪里出了问题呢?求楼主指点!