Qt开源作品1-视频流播放ffmpeg内核

## 一、前言

好久以前就写过这个工具,后来因为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>

## 三、效果图


Qt开源作品1-视频流播放ffmpeg内核


## 四、开源主页

**以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。**

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/)


分享到:


相關文章: