文章目录

  • 音频重采样
  • swr_alloc函数
  • swr_alloc_set_opts函数
  • swr_init函数
  • swr_convert函数
  • 音频基础
    • 音频开发主要应用有
    • 音频开发具体内容有
    • 音频应用的难点
    • 音频开发基础概念有
    • 常见音频编码方式
    • 常见音频压缩格式
    • 音频算法处理的开源库有
    • Android 提供音频相关的API
    • 音频开发的延时标准
  • 参考

音频重采样

音频解码出来之后一般不能直接播放,要经过重采样。有点类似像素图像格式的转换。

swr_alloc函数

/*** Allocate SwrContext.** If you use this function you will need to set the parameters (manually or* with swr_alloc_set_opts()) before calling swr_init().** @see swr_alloc_set_opts(), swr_init(), swr_free()* @return NULL on error, allocated context otherwise*/
struct SwrContext *swr_alloc(void);

swr_alloc函数,分配SwrContext

swr_alloc_set_opts函数

/*** Allocate SwrContext if needed and set/reset common parameters.** This function does not require s to be allocated with swr_alloc(). * On the other hand, swr_alloc() can use swr_alloc_set_opts() * to set the parameters on the allocated context.** @param s               existing Swr context if available, or NULL if not* @param out_ch_layout   output channel layout (AV_CH_LAYOUT_*)* @param out_sample_fmt  output sample format (AV_SAMPLE_FMT_*).* @param out_sample_rate output sample rate (frequency in Hz)* @param in_ch_layout    input channel layout (AV_CH_LAYOUT_*)* @param in_sample_fmt   input sample format (AV_SAMPLE_FMT_*).* @param in_sample_rate  input sample rate (frequency in Hz)* @param log_offset      logging level offset* @param log_ctx         parent logging context, can be NULL** @see swr_init(), swr_free()* @return NULL on error, allocated context otherwise*/
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);

swr_alloc_set_opts函数,设置输入输出参数

swr_init函数

/*** Initialize context after user parameters have been set.* @note The context must be configured using the AVOption API.** @see av_opt_set_int()* @see av_opt_set_dict()** @param[in,out]   s Swr context to initialize* @return AVERROR error code in case of failure.*/
int swr_init(struct SwrContext *s);

swr_init函数,设置用户参数后初始化上下文。

swr_convert函数

swr_convert()

针对每一帧音频的处理。把一帧帧的音频作相应的重采样

int swr_convert(struct SwrContext *s, uint8_t **out, int out_count,
const uint8_t **in, int in_count);

参数1:音频重采样的上下文
参数2:输出的指针。传递的输出的数组
参数3:输出的样本数量,不是字节数。单通道的样本数量。
参数4:输入的数组,AVFrame解码出来的DATA
参数5:输入的单通道的样本数量。

音频基础

音频开发主要应用有

1.1 音频播放器,录音机,语音电话,音视频直播应用,音频编辑处理软件,蓝牙耳机、音箱等。

音频开发具体内容有

2.1 音频采集与播放
2.2 音频算法处理(去噪,静音检测,回事消除,音效处理,功放/增强,混音/分离)
2.3 音频编解码和格式转换
2.4 音频传输协议的开发(SIP,A2DP, AVRCP,RTP,RTCP)

音频应用的难点

3.1 延时敏感、卡顿明感、噪声抑制、回声消除、静音检测、混音算法等。

音频开发基础概念有

4.1 采样率,采样是从模拟语音信号转数字信号的过程,所有的模拟信号都需要通过采样转为可以表示的数字信号。目前44100Hz是唯一可以保证兼容所有Android手机的采样率。

4.2 奈奎斯特理论:采样频率不低于音频信号最高频率的两倍,就可以做到无误还原原始的声音。通常人耳能听到的20HZ-20KHZ的声音,为了保证不失真,采样频率应该在40KHZ以上。

4.3 量化精度(位宽),每一个采样点,都需要一个数值来表示大小,这个大小可以是4bit,8bit,16bit… 位数越多,表示越精细,声音质量就越好,当然,数据量也成倍增大。ENCODING_PCM_16BIT是可以保证兼容所有Android手机的。
4.4 声道数,音频可以从不同的音频源采集并输出到不同的扬声器,一般表示声音录制时的音源数量或者回放时相应的扬声器数量。常见有单身道mono及双声道stereo。

4.5 音频帧,音频数据和视频帧不一样,视频帧就是一张图像,音频数据是流式结构,本身没有明确的一帧的概念,只是为了音频算法处理传输方便,约定2.5ms~60ms为单位的数据量为一帧音频。这个时间为采样时间。AndioRecord内部的音频缓冲区大小不能低于一帧音频帧的大小。一帧音频帧大小:int size = 采样率x位宽x采样时间x通道数。AudioRecord类提供了一个帮助我们确定缓冲区大小的函数,int getMinBufferSize(int sampleRateInHz, int channelConfig,int audioFormat)。假设某双通道音频信号采样率为8k,位宽16bit,20ms一帧的采样时间。则一帧数据的大小为:size = 8000x16x0.02x2 = 640byte(字节)

常见音频编码方式

5.1 A/D需要采样和量化,对应上面提到的采样率和量化宽度。量化的过程被称为编码,根据不同的量化策略,有不同的编码方式,常见有PCM,ADPCM。这些数据代表了无损的原始数字音频信号,添加一些文件头信息,就可以存储为wav文件了。

5.2 获取不同手机终端的编解码分辨率,可以通过adb工具获取/system/etc/media_codecs.xml文件。

常见音频压缩格式

原理:因为有冗余信息,所以需要压缩
6.1 频谱掩蔽效应:人耳能察觉到的频率范围为20hz-20khz,在这个频率范围之外的音频信号属于冗余信号。

6.2 时域掩蔽效应:当强音信号和弱音信号同时出现时,弱信号会听不到,因此此时弱音信号也属于冗余信号。

Android VoIP 相关的开源应用有
7.1 Imsdroid,sipdroid,csipsimple,linephone,WebRTC等。

音频算法处理的开源库有

8.1 Speex,ffmpeg,webrtc

Android 提供音频相关的API

9.1 音频采集:MediaRecoder,AudioRecord
AudioTrack 提供了两种播放模式,一种是static方式,一种是streaming方式,前者需要一次性将所有数据都写入播放缓冲区,简单高效,通常用于铃声播放,系统提醒的音频片段,后者需要按照一定时间间隔不断写入音频数据,理论上可以任何音频播放的场景。

9.2 音频播放:SoundPool,MediaPlayer,AudioTrack

9.3 音频编解码:MediaCodec

9.4 NDK API:OpenSL ES

音频开发的延时标准

10.1 对于高质量语音可以接受延时为300ms,一般而言,如果时延在300~400ms,通话的交互性比较差,但还可以接受,时延大于400ms时,则交互通信非常困难。

参考

SwrContext重采样结构体–swr_alloc()、swr_init()、swr_free()
FFmpeg音频重采样API(libswresample)

音频通道数、采样频率、采样位数、采样个数(样本数)的概念及计算一帧音频的大小、每秒播放的音频字节大小、一帧的播放时长、音频重采样

音视频从入门到精通——FFmpeg之swr_convert音频重采样函数分析相关推荐

  1. 音视频从入门到精通——FFmpeg数据结构分析

    FFmpeg数据结构分析 FFmpeg解码流程 重要结构体之间的关系 AVFormatContext iformat:输入媒体的AVInputFormat,比如指向AVInputFormat ff_f ...

  2. 音视频从入门到精通——FFmpeg分离出PCM数据实战

    什么是PCM? PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样.量化.编码转换成的标准数字音频数据. 描述PCM数据的6 ...

  3. 音视频从入门到精通——FFmpeg 播放器实现音视频同步的三种方式

    老人们经常说,播放器对音频和视频的播放没有绝对的静态的同步,只有相对的动态的同步,实际上音视频同步就是一个"你追我赶"的过程. 音视频的同步方式有 3 种,即:音视频分别向系统时钟 ...

  4. 音视频从入门到精通——ffmpeg3之打印多媒体文件音视频信息

    ffmpeg3之打印多媒体文件音视频信息 av_dump_format函数 /*** Print detailed information about the input or output form ...

  5. 3 FFmpeg从入门到精通-FFmpeg转封装

    1 FFmpeg从入门到精通-FFmpeg简介 2 FFmpeg从入门到精通-FFmpeg工具使用基础 3 FFmpeg从入门到精通-FFmpeg转封装 4 FFmpeg从入门到精通-FFmpeg转码 ...

  6. 1 FFmpeg从入门到精通-FFmpeg简介

    1 FFmpeg从入门到精通-FFmpeg简介 2 FFmpeg从入门到精通-FFmpeg工具使用基础 3 FFmpeg从入门到精通-FFmpeg转封装 4 FFmpeg从入门到精通-FFmpeg转码 ...

  7. 4 FFmpeg从入门到精通-FFmpeg转码

    1 FFmpeg从入门到精通-FFmpeg简介 2 FFmpeg从入门到精通-FFmpeg工具使用基础 3 FFmpeg从入门到精通-FFmpeg转封装 4 FFmpeg从入门到精通-FFmpeg转码 ...

  8. Android音视频学习系列(十) — 基于FFmpeg + OpenSL ES实现音频万能播放器

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  9. Android 音视频开发入门指南

    最近收到很多网友通过邮件或者留言说想学习音视频开发,该如何入门,我今天专门写篇文章统一回复下吧. 音视频这块,目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的,希望我后面能挤出时间整 ...

最新文章

  1. android系统短信库的一些用法
  2. java 获取动态的service_【Android】动态代理在 Retrofit 中的使用
  3. 【 MATLAB 】MATLAB 实现模拟信号采样后的重建(二)零阶保持(ZOH)
  4. linux获取网卡的ip,Windows和Linux系统下获取多网卡的ip地址
  5. java的(PO,VO,TO,BO,DAO,POJO)解释
  6. python语音引擎深度学习_python深度学习之语音识别(speech recognize)
  7. POJ3265 Problem Solving ——动态规划——Pku3265
  8. Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换
  9. android error: undefined reference to 的错误分析
  10. Engagement Center Communication timer实现逻辑
  11. Max Sum Plus Plus HDU - 1024(动态规划求最大M子段和)
  12. Spring Data MongoDB级联保存在DBRef对象上
  13. 第二届河南省大学生程序设计竞赛 Dr.Kong的机器人
  14. CentOS 5打造全功能Web服务器
  15. 苹果供应商:iPhone SE 3 5G和AirPods生产平稳
  16. Spring Boot加载指定属性文件
  17. 微软前WP主管乔北峰长假回归 新岗位或将得罪不少用户
  18. CnOpenData中国海关统计数据
  19. 最新可乐云商城程序源码V0.6版本 可做实物商城网站
  20. 软件工程:状态,行为,事件

热门文章

  1. 飞鸽短信平台发送国际短信
  2. springboot毕设项目牙无忧6ayy4(java+VUE+Mybatis+Maven+Mysql)
  3. 第四章分支结构程序设计
  4. 基于A*搜索算法迷宫游戏开发
  5. 从画家到黑客:成功在于特立独行,不在于随波逐流
  6. 服务器上部署java项目
  7. python 根据经纬度 调取和显示地图_python3调取百度地图API输出某地点的经纬度信息...
  8. 云存储相关技术及术语的探讨
  9. Font Awesome html源码,如何将 Font Awesome 转成 PNG 图标 详细教程 含源代码_html/css_WEB-ITnose...
  10. python3 全局变量_Python3基础 当函数中的局部变量与全局变量同名了,各管各的...