标题:Qt音视频开发6-ffmpeg解码处理
作者:liudianwu
日期:2020-08-08 18:47
内容:
## 一、前言
采用ffmpeg解码,是所有视频监控开发人员必备的技能,绕不过去的一个玩意,甚至可以说是所有音视频开发人员的必备技能。FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在 Linux 下开发出来的,但它可以在包括 Windows 在内的大多数操作系统中编译。这个项目是由 Fabrice Bellard 发起的,现在由 Michael Niedermayer 主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。
关于ffmpeg解码,网上搜索到的代码绝对是一大堆一大堆,而且很多都讲得很详细,解码的函数流程图非常清晰,关于ffmpeg这块的学习本人推荐雷神的博客,分析的相当细致,我在很久以前刚用Qt+ffmpeg解码的时候,参考的就是雷神的例子,当然这些demo其实在ffmpeg的开发包dev下的examples也是非常详细的,只不过没有什么分析过程,参考雷神的博客可以看到很多分析过程。
本人总结的解码过程:
1. 注册解码库相关(av_register_all、avformat_network_init等)
2. 初始化各种参数比如缓存大小等(av_dict_set)
3. 打开视频流或者文件(avformat_alloc_context、avformat_open_input)
4. 获取流信息(avformat_find_stream_info)
5. 获取视频流并初始化视频解码器(av_find_best_stream、avcodec_find_decoder)
6. 获取音频流并初始化音频解码器(av_find_best_stream、avcodec_find_decoder、avcodec_open2)
7. 预分配帧内存(av_frame_alloc)
8. 循环读取音视频帧(av_read_frame、av_packet_unref)
9. 解码视频(avcodec_decode_video2或者avcodec_send_packet、avcodec_receive_frame)
10. 解码音频(avcodec_decode_audio4)
11. 处理结束释放资源(sws_freeContext、av_frame_free、av_free)
## 二、功能特点
1. 多线程实时播放视频流+本地视频+USB摄像头等。
2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。
3. 多线程显示图像,不卡主界面。
4. 自动重连网络摄像头。
5. 可设置边框大小即偏移量和边框颜色。
6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。
7. 可设置两种OSD位置和风格。
8. 可设置是否保存到文件以及文件名。
9. 可直接拖曳文件到ffmpegwidget控件播放。
10. 支持h265视频流+rtmp等常见视频流。
11. 可暂停播放和继续播放。
12. 支持回调模式和 ..
#1 [gospite 10-21 13:32]
学习了~