音频三元组:通道数(channels,比特率(sample_rate),位深(sample_fmt)
这三个元素转换一个或以上,就叫作重采样。
这里主要讨论48000->44100可能会犯得错误。

swr_convert(asc, dst_ptr, dst_nb_samples,src_ptr, src_nb_samples)

参数依次是重采样配置上下文,接收转换后的数据存储地址,往dst_data存储多少个音频采样,待转换的数据地址,放入转换的音频采样数。
假如说是48000->44100,那么如果放入的src_nb_samples不是48000,那么取出的dst_nb_samples也就不是44100,是多少呢:

44100/48000 = dst_nb_samples/src_nb_samples

另一个问题,假如我用aac压缩音频,aac规定每帧音频只能有1024个采样,如果放入src_nb_samples是1920,那么按照上面的公式dst_nb_samples=1764。但是我每次只取1024个采样,用于压缩aac,那么没取的1764-1024=76个字节放哪里去了呢,会不会丢失呢,它其实放在了swr_convert这个函数维护的一个缓冲区中,当你再次调用swr_convert(asc, dst_ptr, dst_nb_samples, NULL, 0)时,把后两个参数置NULL,0,就会把上次没取完的数据取出dst_nb_samples(如果有这么多的话)个采样,它其实是个队列的原理。

最后一个问题,swr_get_out_samples(…)的返回值是缓冲区中的采样个数,那么这个值是指转换后的采样个数还是转换前的呢,经手动验证是转换前的。其实也就是函数只转换dst_nb_samples个采样输出,剩余的值下次调用再转换。
假如我们想取1024个值,那么应该这样调用:

int fifo_size = swr_get_out_samples(asc, 0);
if (fifo_size >= 1115) //x = (1920/1764) * 1024
{int len_left = swr_convert(asc, dst_ptr, dst_nb_samples,NULL, 0)
}

意思是48000->44100时,只有缓冲区有1115个采样时,才能得到1024个采样。
当44100->48000时,当送进去1024采样时,理论上会得到1114.5个输出采样,那么我们输出dst_nb_samples参数应该填多少呢,只要大于等于1115,就可以了,实测输出的采样数len = 1115,1114交替输出。
当dst_nb_samples大于理论输出值时,并不会阻塞,等得到dst_nb_samples个采样才输出,而是输出理论值,由len返回获得理论值。
int len = swr_convert(asc, dst_ptr, dst_nb_samples,
src_ptr, src_nb_samples)

补充:

正常人听觉的频率范围大约在20Hz~20kHz之间,
根据奈奎斯特采样理论(2倍),为了保证声音不失真,采样频率应该在40kHz左右。(采样频率必须大于等于音频信号的最大频率的两倍,记住,是最大频率。)
目前语音识别服务只支持16000Hz和8000Hz两种采样率,其中8000Hz一般是电话业务使用,其余都使用16000Hz。 22050
的采样频率是常用的,44100已是CD音质。

44100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD,SVCD,MP3)所用采样率
48000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
8000 Hz - 电话所用采样率, 对于人的说话已经足够
22050 Hz - 无线电广播所用采样率
引用链接:https://blog.csdn.net/Osean_li/article/details/84107451

出于历史原因,所有CD一律采用44.1KHz,而DVD/BD视频音轨一律采用48KHz。所以不出意外,你听到的那些音乐都是44.1KHz,而你看的视频,它们的音频一般都采用48KHz的采样率。
aac为有损压缩,同时48000->44100的转换对音质也有损伤。
由于人耳听觉范围是20Hz~20kHz,根据香农采样定理(也叫奈奎斯特采样定理),理论上来说采样率大于40kHz的音频格式都可以称之为无损格式。
我们的耳朵听到的频率间隔为20-20KHZ,我们的发声频率为100-3KHZ左右,所以可以看出如果只是单纯的采集发声频率可以使用8KHZ就可以,采样率必须是输入信号最高频率的2倍以上,这样才会最大可能的保存信号信息.故我们的听到的样本的采样率一般都为44.1KHZ及以上.
fdk_aac 支持的音频采样率:7350 8000 11025 12000 16000 22050 24000 32000 44100 48000 64000 88200 96000
fdk_aac 样本类型:只支持16bit pcm输入.
CBR模式:
设置目标码率,当样本之间差异较小时,可以通过该方法更好地控制文件大小,设置每个通道为64kbps.立体声为128kbps
VBR模式:
指定目标质量,而不是码率,质量从1到5由低到高.使用参数-vbr,vbr模式下大致给出了每个通道对应的码率,参考libfdk_aac介绍
首先需要了解的是AAC文件格式有ADIF和ADTS两种,其中ADIF(Audio Data Interchange Format 音频数据交换格式)的特征是解码必须在明确定义的开始处进行,不能从数据流中间开始;而ADTS(Audio Data Transport Stream 音频数据传输流)则相反,这种格式的特征是有同步字,解码可以在这个流中任何位置开始,正如它的名字一样,这是一种和TS流类似的格式。

ADTS格式中每一帧都有头信息,具备流特征,适合于网络传输与处理,而ADIF只有一个统一的头,并且这两种格式的header格式也是不同的。目前主流使用的都是ADTS格式。
正确的说法是不同profile决定了每个aac帧含有多少个sample,具体来说,对应关系如下:

AACENC_GRANULE_LENGTH =
0x0105, /*!< Core encoder (AAC) audio frame length in samples:
- 2048 HE-AAC v1/v2
- 1024: Default configuration.//AAC-LC 1024
- 512: Default length in LD/ELD configuration.
- 480: Length in LD/ELD configuration.
- 256: Length for ELD reduced delay mode (x2).
- 240: Length for ELD reduced delay mode (x2).
- 128: Length for ELD reduced delay mode (x4).
- 120: Length for ELD reduced delay mode (x4). */
其中LC即Low Complexity,HE即High Efficiency,注意,其中数据表示单通道的采样数,如1024,表示单通道每秒采样1024帧。每次送入编码器的数据必须是上述设定或默认的数据,如果不是的话会在缓冲区中暂存,然后够了之后再送进去。
参考:https://blog.csdn.net/mo4776/article/details/104054049
声道数:
0: Defined in AOT Specifc Config
1: 1 channel: front-center
2: 2 channels: front-left, front-right
3: 3 channels: front-center, front-left, front-right
4: 4 channels: front-center, front-left, front-right, back-center
5: 5 channels: front-center, front-left, front-right, back-left, back-right
6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel
7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel
8-15: Reserved

哎呦喂ヾ(✿゚▽゚)ノ~路长馆小,雪轻帘薄,酒热乎,这位爷~您ヾ(✿゚▽゚)ノ~ 里面坐~
本公众号专注分享C++,ffmpeg,opencv等相关音视频知识
webrtc,udp,tcp,rtsp,rtmp,srt/nginx+rtmp等流媒体协议和服务器
同时也会有大厂音视频技术专家不定期直播分享…
国人开发流媒体srs服务器,及yangrtc(国人版的webrtc)协议新动向
偶尔分享下程序员梦呓碎碎念(๑•॒̀ ູ॒•́๑)啦啦啦
目前刚刚开通,接受读者的优质投稿…
鉴于国内音视频圈子小,起步晚,以致分享少,门槛高,特开通分享,一起扇动这阵风吧!
微信扫描下方二维码,关注公众号,赶快进入音视频开发者社区吧!

swr_get_out_samples和swr_convert,比特率重采样相关推荐

  1. swr_convert音频重采样介绍

    在做音频处理的时候,我们有时候需要调整音频流的采样率 或者 采样格式,可能是喇叭不支持 48000 采样率,所以需要降低到 44100 采样了.也可能因为各种业务原因,需要调整 采样率,采样格式,或者 ...

  2. 音视频从入门到精通——FFmpeg之swr_convert音频重采样函数分析

    文章目录 音频重采样 swr_alloc函数 swr_alloc_set_opts函数 swr_init函数 swr_convert函数 音频基础 音频开发主要应用有 音频开发具体内容有 音频应用的难 ...

  3. FFmpeg(五) 重采样相关函数理解

    一.重采样流程 重采样(解码音频数据之后格式不可以直接播放,需要重采样,类似图像的像素转换) 1.分配上下文 2.设置参数(分为(前几个是)输出格式和(后几个)输入格式,两个相对应的) 可以通过改变样 ...

  4. vue创建的挂钩中出错_建立自己的Vue 3 SWR挂钩

    vue创建的挂钩中出错 Version 3 is just around the corner and the composition API is bringing some new excitin ...

  5. FFMpeg4.0相关结构体和函数

    文章目录 相关指令 相关结构体 av_register_all() 已废弃无需添加 avformat_network_init() 初始化网络封装库 AVFormatContext结构体 AVDict ...

  6. ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  7. 在Linux环境下使用ffmpeg将PCM音频数据编码成aac数据

    在Linux环境下使用ffmpeg将PCM音频数据编码成aac数据 程序框图 代码演示 程序框图 将pcm数据经过aac编码器编码成aac数据,我是将从设备上采集的数据经过重采样送入aac编码器进行编 ...

  8. FFmpeg解封装、解码音频和视频(分别使用OpenGL和OpenAL播放)

    1 ffmpeg解码大致流程   下图是ffmpeg解码播放音视频的基本流程: 首先是网络媒体解协议,解协议之后得到对应的媒体文件比如mp4,ts等,这些格式是媒体文件的封装格式,也就是将音频,视频, ...

  9. ffplay实现原理

    1. ffmpeg是音视频界的瑞士军刀: 它提供了从录制.编码.封装.推流到拉流.解封装.解码.滤镜.播放的完整解决方案. 它是跨平台的解决方案,一套代码适配Windows.Linux.Mac OS. ...

最新文章

  1. 第十章—DOM(0)—NODE类型
  2. 案例:返回固定页面的http服务器
  3. sublime python插件_sublime text 3 + python配置,完整搭建及常用插件安装
  4. struts2_HelloWorld
  5. 闭合导线坐标计算表_测量员人员必备:8套工程测量公式计算表,输入参数自动得出结果...
  6. 集合 (一) ----- 集合的基本概念与Collection集合详解
  7. [转]Python中的eval()、exec()及其相关函数
  8. 广州线下见面会,来了!
  9. Docker安装CentOS容器并使用SSH工具远程连接
  10. 怎样将计算机和电视机连接网络连接,电脑怎么连接电视 电脑和电视连接方法图文教程...
  11. 笔记本安装win10+ubuntu双系统超详细教程
  12. 飞控中的IIR二阶滤波器
  13. 微信公众平台-小程序开发工具源码
  14. 【Json】——jsoncpp的序列化以及反序列化
  15. python批量识别二维码图片_python批量操作生成二维码
  16. mac苹果电脑删除顽固残留软件图标
  17. k8s+jenkins发布java服务
  18. SRS4.0源码分析-SrsRecvThread::cycle
  19. 房价每平米80万”是天方夜谭么
  20. 自动化测试框架之DDT-数据驱动

热门文章

  1. python 将单词分割成字母_Python基于分隔符单词拆分列表
  2. python金融分析小知识(34)——年化收益率、年化波动率以及夏普比率的计算
  3. 红黑树添加和删除节点原理
  4. OBS软件转发直播他人直播画面方式方法(包含插件下载地址)
  5. 转帖 金庸所有门派以及所有门派下的所有武功一览
  6. 信息传播模型——SIR的Python实现
  7. 「算法」拓扑排序(货真价实,童叟无欺)
  8. 两篇毕业论文致谢同一个女朋友?大型翻车现场!
  9. Pinbox 一款极简主义风格的网络收藏夹
  10. osx snow leopard下用homebrew 安装php5.3 + php-fpm