您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

FFplay音频滤镜分析

时间:2022-12-07 16:56:33  来源:今日头条  作者:才高八斗船帆ub

音频流的 滤镜是通过 configure_audio_filters() 函数来创建的,因为 ffplay 为了代码的通用性,即便命令行参数不使用滤镜,AVFrame 也会过一遍 空滤镜做下样子。

configure_audio_filters() 函数的流程图如下:

 

configure_audio_filters() 函数的定义如下:

static int configure_audio_filters(VideoState *is, const char *afilters, int force_output_format){....}

下面讲解一下这个函数的参数。

VideoState *is ,是 ffplay 播放器的全局管理器。

char *afilters,是滤镜字符串,例如 下面的命令:

ffplay -af "atempo=2.0" -i juren-5s.mp4

"atempo=2.0" 这个字符串就会赋值给 afilters 。

int force_output_format ,代表是否强制把 buffersink 出口滤镜的音频帧采样等信息 设置为 跟 is->audio_tgt 一样。

之前说过 is->audio_tgt 是音响硬件设备打开的信息。is->audio_tgt 是最终要传递给 SDL 的音频格式。所有的采样率,声道数等等最后都要转成 is->audio_tgt 。


下面来分析一下configure_audio_filters() 函数里面的重点代码,如下:

 

这个函数一开始就定义了 一些只有 2 个元素的数组,这其实是 ffmpeg 项目传递参数的方式,传递一个数组进去函数,主要有两种方式。

1, 传递数组的大小。就是有多少个元素。

2, 传递数组的结尾,只要读到结尾元素 (-1),就算结束了。

ffmpeg 大部分函数采用的是第二种方式。


然后他会调 avfilter_graph_free() 释放滤镜容器(FilterGraph),有些同学可能会疑惑,is->agraph 一开始不是 NULL 吗? 为什么需要释放?

is->agraph 一开始确实是 NULL,但是 configure_audio_filters() 这个函数可能会调用第二次,第二次的时候 is->agraph 就不是 NULL了。

configure_audio_filters() 第一次调用是在 stream_component_open() 里面,如下:

 

第二次调用是在 audio_thread() 里面,如下:

 

第二次调用 configure_audio_filters() 是因为实际解码出来的 AVFrame 的采样率,声道等,跟容器里面记录的不一致,之前 is->audio_filter_src 是直接从容器,封装层取的数据。封装层记录的音频采样率等,可能是错的,需要以实际解码出来的 AVFrame 为准。

 

而且,注意,第二次的时候,force_output_format 参数会置为 1,这样会强制 buffersink 出口滤镜的采样信息等 设置为 is->audio_tgt 一样。

其实configure_audio_filters() 必然会调第二次的,因为 is->auddec.pkt_serial != last_serial 这个条件肯定是真。


接着就是设置 滤镜使用的线程数量,0 为自动选择线程数量,如下:

is->agraph->nb_threads = filter_nbthreads;

第三个重点是,设置重采样选项(aresample_swr_opts),如下:

 

什么样的命令行参数才是重采样选项的,在 libswresample/options.c 里面可以找到,如下:

 

举个例子,如下:

ffpaly -ich 1 -i juren-5s.mp4

ich 1 就会被解析拷贝进去 ffplay.c 里面的 swr_opts 变量里面。

这里还用到了一个新的函数 av_opt_set(),这个函数其实不只可以设置滤镜的属性字段,还可以设置大多数数据结构的属性字段,例如解码器,封装器 等等,只要内部有 AVClass 的数据结构,都能用 av_opt_set() 来设置属性,详情请阅读《opt.h文件函数分析》


接下来的重点是设置入口跟出口滤镜,如下:

 

出口滤镜还设置了 sample_fmts 为 AV_SAMPLE_FMT_S16,这是 ffpaly 播放器自己的特性,就是说无论MP4文件里面的音频格式是怎样的,他都会转成 AV_SAMPLE_FMT_S16 格式丢给 SDL 播放,而且它在用 SDL_OpenAudioDevice 打开音频设备的时候,就是用的 S16 格式,这是写死的


force_output_format 的逻辑主要是 强制 buffersink 出口滤镜的采样信息等 设置为跟 is->audio_tgt 一样。audio_tgt 是 SDL 接受音频帧的最终格式。

第一次调用 configure_audio_filters() 函数,force_output_format 为 0,不会跑进去这块逻辑。


最后就是调 configure_filtergraph() 函数来链接入口跟出口滤镜,同时创建滤镜容器(FilterGraph),如下:

 

上图最重要的是,入口滤镜 跟 出口滤镜 被赋值到全局管理器 is 了。后面只要把解码器输出的 AVFrame 往入口滤镜丢,然后往出口滤镜读就行了。



Tags:FFplay   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
音频流的 滤镜是通过 configure_audio_filters() 函数来创建的,因为 ffplay 为了代码的通用性,即便命令行参数不使用滤镜,AVFrame 也会过一遍 空滤镜做下样子。configure_audio...【详细内容】
2022-12-07  Tags: FFplay  点击:(0)  评论:(0)  加入收藏
背景说明FFmpeg是一个开源,免费,跨平台的视频和音频流方案,它提供了一套完整的录制、转换以及流化音视频的解决方案。而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器...【详细内容】
2022-02-22  Tags: FFplay  点击:(319)  评论:(0)  加入收藏
本文还是着重分析数据读取线程。还是先上ffplay"藏宝图"。 从ffplay框架分析我们可以看到,ffplay有专⻔的线程read_thread()读取数据,且在调⽤av_read_frame读取数据包之前...【详细内容】
2020-09-15  Tags: FFplay  点击:(490)  评论:(0)  加入收藏
1.框架分析 ffplay.c是FFmpeg源码⾃带的播放器,调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。例如哔哩哔哩著名开源项⽬ijkplayer也是基于ffplay.c进⾏⼆次开发。ffplay实...【详细内容】
2020-09-09  Tags: FFplay  点击:(234)  评论:(0)  加入收藏
▌简易百科推荐
音频流的 滤镜是通过 configure_audio_filters() 函数来创建的,因为 ffplay 为了代码的通用性,即便命令行参数不使用滤镜,AVFrame 也会过一遍 空滤镜做下样子。configure_audio...【详细内容】
2022-12-07  才高八斗船帆ub  今日头条  Tags:FFplay   点击:(0)  评论:(0)  加入收藏
请求测试 文档说明api地址: https://demo.chuanyufs.com/seek/public/index.php/api/qyinfo请求方式:GET|POST测试 key:5d50908c5a2e5c8a75d379341cd0ad88demo:https://demo.c...【详细内容】
2022-12-05  天天都是我洗碗  今日头条  Tags:API接口   点击:(10)  评论:(0)  加入收藏
DOM(Document Object Model)也称为文档对象模型,是 W3C 组织推荐的处理可扩展标记语 言的标准编程接口。DOM 是一种与浏览器、平台和语言无关的应用程序接口(API),它可以动态 地访...【详细内容】
2022-12-03  素手挽清风LINDA  今日头条  Tags:DOM   点击:(8)  评论:(0)  加入收藏
前言在之前的篇章中讲解了yaml文件的基本语法规则、yaml文件的读写方法、通过unittest自动化测试框架+ddt+yaml实现数据驱动。同样Pytest自动化测试框架也能读取yaml文件实...【详细内容】
2022-12-03  测试媛小懒  今日头条  Tags:pytest   点击:(19)  评论:(0)  加入收藏
在Spring项目中,我们在定义一个bean的时候,可能会随手写一个close或者shutdown方法去关闭一些资源。但是有时候这两个看起来很正常的方法名,即使我们不添加任何特殊配置,也可能...【详细内容】
2022-12-02  程序员拾山  今日头条  Tags:close   点击:(16)  评论:(0)  加入收藏
小白是一家大型食品公司下属子公司的质检员。由于总公司主营业务调整,要将原先两家子公司进行了整合,业务相近的部门也进行了合并。最近,HR与小白协商,其原岗位已撤销,想安排他到...【详细内容】
2022-12-02  上观新闻    Tags:解除劳动合同   点击:(8)  评论:(0)  加入收藏
短短几行代码对全球产生巨大影响 1997年,Ethan Zuckerman发明了弹出式广告,从而打破了互联网。他在Tripod.com工作,一家允许人们免费制作小网页的在线服务公司。为了赚钱,Tripo...【详细内容】
2022-12-01  金文号FR  今日头条  Tags:代码   点击:(8)  评论:(0)  加入收藏
大家好,我是Echa.最近有部分粉丝私信我,有么有提高运营方面工作效率实用的开源工具,找啊找,今天给老铁们分享5个非常实用的开源工具。创作不易,喜欢的老铁们加个关注,点个赞,后面会...【详细内容】
2022-12-01  Echa.  今日头条  Tags:开源工具   点击:(15)  评论:(0)  加入收藏
老铁们有没有发现大部分网站都瞬间变灰色了。接下来我给老铁们快速解析Web网站灰色皮肤的,其实很简单的CSS3就能实现,具体如下:filter: grayscale 使用可以调整元素的灰度值.bi...【详细内容】
2022-12-01  Echa攻城狮  今日头条  Tags:代码   点击:(20)  评论:(0)  加入收藏
作者 | 卞安 责编 | 屠敏出品 | CSDN(ID:CSDNnews)AI 作画,作为一个局部领域的产品方向,在基于机器学习算法基础上,为世界打开了一扇大门,随着 AI 作画类软件的大放异彩,基于...【详细内容】
2022-12-01    CSDN  Tags:程序开发   点击:(11)  评论:(0)  加入收藏
站内最新
站内热门
站内头条