## 一、前言
好久以前就写过这个工具,后来因为Qt版本的不断升级以及ffmpeg也经历过好多次的迭代,可能从官网下载的ffmpeg搭配原来的代码不能正确编译,因为很多api已经变了,所以这次特意抽空全部整理重写一遍,只求最精简最好用,同时兼容了ffmpeg3和ffmpeg4,并且同时支持32位的库和64位的库,这样任何小白拿过去直接编译就能用。
1. 多线程实时绘制
2. 同时解码视频流和音频流
3. 支持任意Qt版本任意系统任意编译器
4. 解码和窗体分离,拓展性强
5. 可选ffmpeg3和ffmpeg4两个版本
6. 可选32位和64位的ffmpeg库
7. 注释绝对详细,包你满意
## 二、代码思路
<code>第一步:引入ffmpeg的头文件 ```c++extern
"C"
{ } ``` 第二步:注册ffmpeg的库 这里发现很多人每个类都注册一次,搞得内存每次增加很多,不是不可以,而是没有必要,其实ffmpeg的库和解码器等,在一个程序中只需要注册一次即可,没必要每个视频类都注册一次。 ```c++void
FFmpegThread::initlib() {static
QMutex mutex;QMutexLocker
locker
(&mutex)
;static
bool
isInit =false
;if
(!isInit) { av_register_all(); avdevice_register_all(); avformat_network_init(); isInit =true
; qDebug() << TIMEMS <"init ffmpeg lib ok"
<" version:"
<< FFMPEG_VERSION; QStringList listCodeName; AVCodec *code = av_codec_next(NULL
);while
(code !=NULL
) { listCodeName << code->name; code = code->next; } qDebug() << TIMEMS << listCodeName; } } ``` 第三步:设置参数 ```c++ av_dict_set(&options,"buffer_size"
,"8192000"
,0
); av_dict_set(&options,"rtsp_transport"
,"tcp"
,0
); av_dict_set(&options,"stimeout"
,"3000000"
,0
); av_dict_set(&options,"max_delay"
,"1000000"
,0
); av_dict_set(&options,"threads"
,"auto"
,0
); ``` 第四步:打开视频流 具体代码比较多,详细代码请自行开源主页下载。 第五步:解码图像 ```c++void
FFmpegThread::run() { QTime time;while
(!stopped) {if
(isPlay) {this
->init(); isPlay =false
;continue
; } time.restart();if
(av_read_frame(avFormatContext, avPacket) >=0
) {int
packetSize = avPacket->size;int
index = avPacket->stream_index;if
(index == videoStreamIndex) { avcodec_decode_video2(videoCodec, avFrame2, &frameFinish, avPacket);if
(frameFinish) { sws_scale(swsContext, (const
uint8_t
*const
*)avFrame2->data, avFrame2->linesize,0
, videoHeight, avFrame3->data, avFrame3->linesize);QImage
image
((uchar *)buffer, videoWidth, videoHeight, QImage::Format_RGB32)
;if
(!image.isNull()) {emit
receiveImage
(image)
; } msleep(1
); } }else
if
(index == audioStreamIndex) { } } av_packet_unref(avPacket); av_freep(avPacket); msleep(1
); }free
(); stopped =false
; isPlay =false
; qDebug() << TIMEMS <"stop ffmpeg thread"
; } ```/<code>
## 三、效果图
## 四、开源主页
**以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。**
1. 国内站点:[
https://gitee.com/feiyangqingyun/QWidgetDemo](
https://gitee.com/feiyangqingyun/QWidgetDemo)
2. 国际站点:[
https://github.com/feiyangqingyun/QWidgetDemo](
https://github.com/feiyangqingyun/QWidgetDemo)
3. 个人主页:[
https://blog.csdn.net/feiyangqingyun](
https://blog.csdn.net/feiyangqingyun)
4. 知乎主页:[
https://www.zhihu.com/people/feiyangqingyun/](
https://www.zhihu.com/people/feiyangqingyun/)