Your Site Title

Audio

声音

处理流程

  1. 音频采集(模数转换成PCM数据)
  2. 音视频编码(音视频原数据, 编码压缩成小数据)
  3. 传输
  4. 音视频解码
  5. 音视频渲染

声音的产生

  1. 声音是由物体振动产生
  2. 它可以通过空气, 固体, 液体等进行传输
  3. 振动耳膜

人类听觉范围

1秒钟振动的次数 次声波 20Hz 可听声波 20kHz 超声波

声音的三要素

声音模数转换

  1. 采样: 越大越真, 常用采样频率: 441000, 48000(一般), 32000, 16000, 8000
  2. 10进制转成二进制方波
  3. 保存二进制位数, 影响音量大小

原始数据格式:

  1. PCM:
  2. WAV: PCM + 数据头

  3. 采样大小(位深): 一个采样用多少bit存放. 常用的是16bit
  4. 采样率: 8k, 16k, 32k, 44.1k, 48k
  5. 声道数: 单, 双, 多
  6. 码率: 采样率 * 采样大小 * 声道数 = PCM

采集音频的方式

Android

AudioRecord: 偏低层 MediaRecorder: 偏应用

iOS

AudioUnit AVFoundation

Windows

DirectShow OpenAl >window7 audio cool

FFmpeg

通过命令方式 ffmpeg -f avfoundation -i :0 out.wav

FFmpeg采集音频流程

  1. 打开输入设备 #include “libavdevice/avdevice.h” #include “libavformat/avformat.h”

注册设备 avdevice_register_all();

设置采集方式 AVInputFormat *iformat = av_find_input_format(“avfoundation”); 打开音频设备 AVFormatContext *fmt_ctx = NULL; AVDictionary *opetions = NULL; avformat_open_input(&fmt_ctx, “:0”, iformat, &opetions);

av_strerror 打印ffmpeg 错误信息
  1. 读取数据 av_read_frame

  2. 将音频数据写入文件 fopen() 打开文件 fwrite(pkt.data, pkt.size, 1, outfile); 写入数据 fclose(outfile);

音频原理

音频压缩

遮蔽信息

无损编码

熵编码

常见的音频编码器

OPUS > AAC > Ogg

AAC 介绍

AAC(Advanced Audio Coding), 为了取代mp3格式. 最开始基于MPEG-2的音频编码技术, MPEG-4出来后AAC重新集成了其特性, 加入了SBR技术和PS技术.

常用的规格有:

AAC格式, AAC头格式:

ADIF

ffmpeg -i xxx.mp4 -vn -c:a libfdk_aac -ar 441000 -channels 2 -profile:a aac_he_v2 3.aac

音频重采样

将音频三元组(采样率, 采样大小, 通道数)的值转成另外一组值

为什么要重采样

怎么获取参数

重采样的步骤

  1. 创建重采样上下文
  2. 设置参数
  3. 初始化重采样
  4. 进行重采样

    swr_alloc_set_opts swr_init swr_convert swr_free

ffmpeg 编码过程

*AVFrame - 未编码 *AVPacket - 编码过

从设置读取数据, ffmpeg当成从多媒体文件中读取, 读取的是AVPacket, 里面是PCM数据, 正常的做法是有个解码过程, 把AVPacket解码成AVFrame

  1. 创建编码器
  2. 创建上下文
  3. 打开编码器
  4. 送数据给编码器(会缓冲数据)
  5. 编码
  6. 释放数据

    avcodec_find_encoder avcodec_alloc_context3 avcodec_open2 avcodec_frame_alloc av_frame_get_buffer avcodec_send_frame avcodec_receive_packet

音频帧

2.5ms - 60ms 定义为一帧, 时间为采样时间

采样率: 8kHz 通道: 2 位宽: 16bit 帧: 20ms

8000 * 2 * 16 * 0.02 = 5120bit / 8 = 640byte

Reference

AAC Frame Header (ADTS)