嵌入式工程师成长之路 系列文章 总目录
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路
原创不易,文章会持续更新
文章会同步到作者个人公众号上,感谢扫码关注

所有文章总目录:【嵌入式 无人机 电机控制】
原创视频总目录:【嵌入式 无人机 电机控制】

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对视频解码、视频像素和尺寸转换、重采样】相关推荐

  1. 【专题3:电子工程师 之 上位机】 之 【47.使用QT Opengl显示YUV图像】

    嵌入式工程师成长之路 系列文章 总目录 希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所 ...

  2. STM32+ov7725+ESP8266实现无线图传-完成上位机图像显示

    一.需求 stm32f407探索者开发板和STM32F103ZET6战舰开发板.接正点原子ov5640.OV7725.OV2640摄像头,通过esp8266Wi-Fi模块(透传模式)将摄像头采集到的r ...

  3. 串口数据波形显示_【专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传可飙到500KB/S...

    [专题教程第6期]SEGGER的J-Scope波形上位机软件,RTT模式波形上传速度可狂飙到500KB/S左右 说明: 1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通 ...

  4. 【专题教程第4期】SEGGER的J-Scope波形上位机软件,HSS模式简单易用,无需额外资源,也不需要写目标板代码

    说明: 1.在实际项目中,很多时候,我们需要将传感器或者ADC的数值以波形的形式显示.通常的解决办法是用串口上位机,USB接口上位机或者MDK的逻辑分析仪功能,使用这三种方式都比较繁琐.本期专题为大家 ...

  5. 自动化工程师如何快速上手上位机编程

    大家好! 我是华山自控编程的朱老师 自动化控制技术不断发展,掌握一门上位机编程语言成为自动化工程师越来越迫切的需求.工业4.0,智能制造,无人工厂,远程监控等自动化的方方面面对技术要求越来越高,用上位 ...

  6. 什么是核心竞争力——源自半导体行业,一个上位机软件开发工程师

    到底什么是核心竞争力 ----来自半导体行业,一个上位机软件开发工程师 我的工作侧重于软件二次开发,因行业问题,软件需要对电机,泵等硬件进行通信,按照一定的顺序对其进行控制,对Wafer进行加工,以达 ...

  7. 上位机软件工程师_硬件工程师吐槽起自己来能有多狠?看看,你就知道了

    俗话说,干一行爱一行 现实是,最爱的行业往往伤人最深 无论外人看起来多么高大上的硬件行业 工程师一句话就能让其原形毕露 吐槽起来,那更是一个稳准狠 上次发布的<硬件工程师崩溃图鉴> 就收到 ...

  8. 工业监测自动化上位机软件开发,支持PLC通信,以及与各类品牌 的电流表、频谱仪、电子负载、功率计等通信

    工业监测自动化上位机软件开发,支持PLC通信,以及与各类品牌 的电流表.频谱仪.电子负载.功率计等通信 本人拥有十多年工业项目.仪器仪表产品.教学产品开发以及培训经验,精通STM32.Msp430等各 ...

  9. 新阁上位机开发--10年工程师的Modbus总结

    前言 大家好,我是新阁上位机开发付老师. 我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解 ...

最新文章

  1. java -- 线程的生命周期
  2. 【Python】编程笔记5
  3. Java中避免if-else-if:策略模式
  4. 什么是指利用计算机和现代,现代计算机一般指什么计算机?
  5. XSS的基本概念和原理
  6. SM3算法的编程实现
  7. IP地址(Internet Protocol Address),即互联网协议地址
  8. 小米摄像头共享显示服务器错误6,小米摄像头
  9. java+ssm+sql就业管理系统
  10. 【每日01】岛上书店
  11. my97DatePicker选择年、季度、月、周、日(转)
  12. 山重水复疑无路_最快下降问梯度(深度学习入门系列之七)
  13. 南卡小音舱体验评测:CD级音质听感震撼
  14. 古文选读161篇--蔡礼旭老师选
  15. Android AMS(android 11)
  16. 【20180904】【查漏补缺】量纲分析法—Pi定理(Buckingham定理)
  17. 商人的诀窍-(贪心出问题最多的-快排函数错)
  18. 我碌碌无为的研究生生活
  19. CPU速度慢了,怎么办?
  20. 浙江发布全国首个诉讼服务规范省级标准

热门文章

  1. 什么是svn,以及svn的简单教程
  2. appium使用教程python_Appium使用教程
  3. 【PAT1003】“我要通过“解答笔记
  4. 坐标变换与坐标系变换
  5. 详细的Tomcat安装教程
  6. 《企业网络构建与安全管理教程》上册
  7. http1.1和http2的主要区别
  8. 2018暑期在校培训总结
  9. 改变你的人生的32句经典句子
  10. 离散傅里叶变换的基本性质