【专题3:电子工程师 之 上位机】 之 【44.使用ffmpeg对视频解码、视频像素和尺寸转换、重采样】
嵌入式工程师成长之路 系列文章 总目录 |
---|
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 |
原创不易,文章会持续更新 |
文章会同步到作者个人公众号上,感谢扫码关注 |
所有文章总目录:【嵌入式 无人机 电机控制】 |
---|
原创视频总目录:【嵌入式 无人机 电机控制】 |
1.解码相关的函数
大概步骤:通过解码器ID找到对应的解码器,然后再创建一个解码器上下文,再通过解码器上下文打开解码器。
(1)void avcodec_register_all(void)
:注册所有的解码器。
(2)AVCodec *avcodec_find_decoder(enum AVCodecID id)
:通过解码器ID找到对应的解码器。
(3)AVCodec *avcodec_find_decoder_by_name(const char *name)
:通过名字找到对应的解码器,硬解码方式时,一般会使用这种方式。
AVCodec结构体仅仅是一些解码相关的配置信息,真正解码时,还需要一个解码器上下文AVCodecContext,解码器上下文存放的是本次解码的参数信息。
(4)AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
:根据解码创建解码器上下文。老版本的ffmpeg不需要这一步,这一步耦合在解封装的函数内部。但新版本的将解封装和解码进行了分离,所以需要先分配一个上下文空间。
(5)void avcodec_free_context(AVCodecContext **avctx)
:清理解码器上下文空间。
(6)int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
:打开解码器。第二个参数可以直接传NULL,因为在avcodec_alloc_context3函数中已经指定了。第三个参数指解码过程的参数(所有的参数在:/libavcodec/options_table.h中),一般直接使用默认即可。
(7)int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par)
:将AVStreame中的codecpar参数复制到解码器上下文结构体来。
2.视频像素和尺寸转换相关函数
硬解码出来的视频格式和软解码出来的视频格式是不一样的,或者解码出来的是YUV444格式的,需要转换为YUV420的,或者解码出来的是BGR的,需要转换为RGB的,这里都涉及到像素格式的转换。
直接使用ffmpeg接口来转换,用ffmpeg的好处就是接口简单,但性能开销还是比较大。这部分可以用gpu来做,效率会更高;实际产品中,建议还是用GPU来做。
(1)struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,int dstW, int dstH, enum AVPixelFormat dstFormat,int flags, SwsFilter *srcFilter,SwsFilter *dstFilter, const double *param)
:获得一个像素格式转换的上下文。
struct SwsContext *sws_getContext(int srcW,//原宽int srcH,//原高enum AVPixelFormat srcFormat,//原来的格式int dstW,//目标宽int dstH,//目标高enum AVPixelFormat dstFormat,//目标格式int flags,//只针对尺寸转换的算法,一般选择SWS_FAST_BILINEAR就可以了SwsFilter *srcFilter,//过滤器一般用不到,直接传NULLSwsFilter *dstFilter,//过滤器一般用不到,直接传NULLconst double *param);//这个是和转换算法有关的,譬如使用矩阵算法进行转换,可以通过//param传递一个矩阵,我们直接作用默认就可以了,即直接传NULL
#define SWS_FAST_BILINEAR 1 //一般直接使用这种方式就可以了
#define SWS_BILINEAR 2
#define SWS_BICUBIC 4
#define SWS_X 8
#define SWS_POINT 0x10
#define SWS_AREA 0x20
#define SWS_BICUBLIN 0x40
#define SWS_GAUSS 0x80
#define SWS_SINC 0x100
#define SWS_LANCZOS 0x200
#define SWS_SPLINE 0x400
(2)int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],const int srcStride[], int srcSliceY, int srcSliceH,uint8_t *const dst[], const int dstStride[])
:sws_getContext这个函数仅仅是获得一个转换上下文,而真正的转换则需要使用sws_scale函数。
(3)void sws_freeContext(struct SwsContext *swsContext)
:释放转换上下文空间,这里传递的不是指针的指针,也就是sws_freeContext函数内部没有将swsContext置为NULL,所以需要手动置为NULL。
3.重采样相关函数
只有解码之后的音频数据才需要重采样,因为直接解码出来的音频数据是32bit的,即不能直接播放的,需要进行转换,一般是转为16bit的。
(1)struct SwrContext *swr_alloc(void)
:设置重采样上下文。
(2)struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate,int log_offset, void *log_ctx)
:设置重采样上下文参数。
struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,//输出格式设置int64_t out_ch_layout,//声道类型,是立体声,还是其他enum AVSampleFormat out_sample_fmt, //输出的样本格式,有float的也有s16的int out_sample_rate,//样本率可以不变,输出和输入一样。当然可以改变采样率是播放速度变快//但这种变速会使声音失真//输入格式设置int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate,int log_offset, void *log_ctx);
(3)int swr_init(struct SwrContext *s)
:设置好参数之后,就进行初始化。
(4)void swr_free(struct SwrContext **s)
:释放空间。
(5)int swr_convert(struct SwrContext *s, uint8_t **out, int out_count,const uint8_t **in , int in_count)
:将一帧一帧的音频数据进行重采样。
int swr_convert(struct SwrContext *s, uint8_t **out, int out_count,//单通道的样本数量const uint8_t **in, //输入的数据,直接使用avframe->data即可int in_count);//单通道的样本数量
【专题3:电子工程师 之 上位机】 之 【44.使用ffmpeg对视频解码、视频像素和尺寸转换、重采样】相关推荐
- 【专题3:电子工程师 之 上位机】 之 【47.使用QT Opengl显示YUV图像】
嵌入式工程师成长之路 系列文章 总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所 ...
- STM32+ov7725+ESP8266实现无线图传-完成上位机图像显示
一.需求 stm32f407探索者开发板和STM32F103ZET6战舰开发板.接正点原子ov5640.OV7725.OV2640摄像头,通过esp8266Wi-Fi模块(透传模式)将摄像头采集到的r ...
- 串口数据波形显示_【专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传可飙到500KB/S...
[专题教程第6期]SEGGER的J-Scope波形上位机软件,RTT模式波形上传速度可狂飙到500KB/S左右 说明: 1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通 ...
- 【专题教程第4期】SEGGER的J-Scope波形上位机软件,HSS模式简单易用,无需额外资源,也不需要写目标板代码
说明: 1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通常的解决办法是用串口上位机,USB接口上位机或者MDK的逻辑分析仪功能,使用这三种方式都比较繁琐.本期专题为大家 ...
- 自动化工程师如何快速上手上位机编程
大家好! 我是华山自控编程的朱老师 自动化控制技术不断发展,掌握一门上位机编程语言成为自动化工程师越来越迫切的需求.工业4.0,智能制造,无人工厂,远程监控等自动化的方方面面对技术要求越来越高,用上位 ...
- 什么是核心竞争力——源自半导体行业,一个上位机软件开发工程师
到底什么是核心竞争力 ----来自半导体行业,一个上位机软件开发工程师 我的工作侧重于软件二次开发,因行业问题,软件需要对电机,泵等硬件进行通信,按照一定的顺序对其进行控制,对Wafer进行加工,以达 ...
- 上位机软件工程师_硬件工程师吐槽起自己来能有多狠?看看,你就知道了
俗话说,干一行爱一行 现实是,最爱的行业往往伤人最深 无论外人看起来多么高大上的硬件行业 工程师一句话就能让其原形毕露 吐槽起来,那更是一个稳准狠 上次发布的<硬件工程师崩溃图鉴> 就收到 ...
- 工业监测自动化上位机软件开发,支持PLC通信,以及与各类品牌 的电流表、频谱仪、电子负载、功率计等通信
工业监测自动化上位机软件开发,支持PLC通信,以及与各类品牌 的电流表.频谱仪.电子负载.功率计等通信 本人拥有十多年工业项目.仪器仪表产品.教学产品开发以及培训经验,精通STM32.Msp430等各 ...
- 新阁上位机开发--10年工程师的Modbus总结
前言 大家好,我是新阁上位机开发付老师. 我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解 ...
最新文章
- java -- 线程的生命周期
- 【Python】编程笔记5
- Java中避免if-else-if:策略模式
- 什么是指利用计算机和现代,现代计算机一般指什么计算机?
- XSS的基本概念和原理
- SM3算法的编程实现
- IP地址(Internet Protocol Address),即互联网协议地址
- 小米摄像头共享显示服务器错误6,小米摄像头
- java+ssm+sql就业管理系统
- 【每日01】岛上书店
- my97DatePicker选择年、季度、月、周、日(转)
- 山重水复疑无路_最快下降问梯度(深度学习入门系列之七)
- 南卡小音舱体验评测:CD级音质听感震撼
- 古文选读161篇--蔡礼旭老师选
- Android AMS(android 11)
- 【20180904】【查漏补缺】量纲分析法—Pi定理(Buckingham定理)
- 商人的诀窍-(贪心出问题最多的-快排函数错)
- 我碌碌无为的研究生生活
- CPU速度慢了,怎么办?
- 浙江发布全国首个诉讼服务规范省级标准