Android音频简介

1.基本概念

1.1 播放模式:

Deep buffer playback

Android开发中最常用的播放模式,音乐等对时延要求不高的声音输出采用该模式。边加载边播放,由AP进行解码。

Low latency playback

低延迟播放模式,用于按键音、游戏背景音等对时延要求高场景。一次加载完数据,应用一般采用soundpool播放。

Compressed offload playback

AP直接将音频数据传给DSP,DSP完成音频解码,混音及音效处理,这样可以降低CPU的负载,目前支持的格式有MP3/AAC。

1.2 周期,帧,采样率等关系

buffer的size可以通过ALSA library的API进行修改。如果buffer设的太大,那么一次数据的传输需要的延迟会增加。为了解决这个问题,ALSA将buffer分为一系列的period(在OSS/Free语境中称为fragment),然后以period为单位进行数据的传输。

因此,在buffer里有以下几个单位:

  • period 一个period当中存储多个多个frame
  • frame 一个frame中存储一个或多个同一时间采集的sample。多个ADC/DAC用于同一时间采集/转换多个sample,那么这几个同时间被处理的sample组成一个frame。通常,如果一个设备有N个channel,那么它的一个frame等于N个sample
  • sample 每一个采样得到的数值称为一个sample,它可能是多个字节的,大端或者小端,浮点数或者整数,有符号或者无符号

bits_per_sample = 16;

channels = 2;

rate = 44100;

公式:byte_rate = (bits_per_sample / 8) * channels * rate;

则:byte_rate = 176400

帧大小:

frame_size = sample * channels

sample: 即对应不同格式的位数,如PCM_16_BIT即2位

channels:信道数,如左右信道,就是2

static inline size_t audio_bytes_per_sample(audio_format_t format)
{
    size_t size = 0;

    switch (format) {
    case AUDIO_FORMAT_PCM_32_BIT:
    case AUDIO_FORMAT_PCM_8_24_BIT:
        size = sizeof(int32_t);
        break;
    case AUDIO_FORMAT_PCM_24_BIT_PACKED:
        size = sizeof(uint8_t) * 3;
        break;
    case AUDIO_FORMAT_PCM_16_BIT:
        size = sizeof(int16_t);
        break;
    case AUDIO_FORMAT_PCM_8_BIT:
        size = sizeof(uint8_t);
        break;
    case AUDIO_FORMAT_PCM_FLOAT:
        size = sizeof(float);
        break;
    default:
        break;
    }
    return size;
}

采样率:比如48kHz表示采集时每秒采集48k次,此时就会有48k个采样点;

采样大小:如16bit表示每个采样点存储在16bit内存中,即需要2个字节在保存;

声道很好理解:比如双声道是为了人耳听左右耳声音不同,比较有立体效果;但从音频数据存储的角度来说就要保存双份的采样音频数据。

PCM音频流的码率 = 采样率 * 采样大小 * 声道数。

如48k x 16 x 2=1536kb/s,即每秒的音频原始数据需要占1536 kbit。

可以理解为音频采样时,按每秒48k次的频率进行采样,16bit即每个采样点存2个字节,每次存2份(声道),这1s的音频数据需要用的1536kbit空间来存放,也就是1536kbit/8=192k字节。
 

调试

调试节点

1、查看当前的声卡:
cat /proc/asound/cards
2、查看pcm设备列表:
cat /proc/asound/pcm
3、查看当前有哪些进程占用了pcm设备节点
lsof |grep pcm    
4、查看有哪些音频设备节点
#ls /dev/snd/                                                                                                                                       controlC0 pcmC0D12p pcmC0D16c pcmC0D19p pcmC0D21p pcmC0D24c pcmC0D27p pcmC0D2c  pcmC0D31p pcmC0D34c pcmC0D3p pcmC0D6c pcmC0D8p  sequencer2 
pcmC0D0p  pcmC0D13c pcmC0D17c pcmC0D1c  pcmC0D22p pcmC0D25p pcmC0D28c pcmC0D2p  pcmC0D32p pcmC0D34p pcmC0D4c pcmC0D6p pcmC0D9p  timer      
pcmC0D10c pcmC0D14c pcmC0D18c pcmC0D20c pcmC0D23c pcmC0D26p pcmC0D28p pcmC0D30c pcmC0D33c pcmC0D35c pcmC0D4p pcmC0D7c seq       
pcmC0D11p pcmC0D15p pcmC0D19c pcmC0D20p pcmC0D23p pcmC0D27c pcmC0D29c pcmC0D30p pcmC0D33p pcmC0D3c  pcmC0D5p pcmC0D7p sequencer


音频设备的命名规则为 [device type]C[card index]D[device index][capture/playback],即名字中含有4部分的信息:

device type
设备类型,通常只有comtrol/pcm这2种。从上图可以看到声卡会管理很多设备,PCM设备只是其中的一种设备。
card index
声卡的id,代表第几块声卡。通常都是0,代表第一块声卡。手机上通常都只有一块声卡。
device index
设备的id,代表这个设备是声卡上的第几个设备。设备的ID只和驱动中配置的DAI link的次序有关。如果驱动没有改变,那么这些ID就是固定的。
capture/playback
只有PCM设备才有这部分,只有c和p两种。c代表capture,说明这是一个提供录音的设备,p代表palyback,说明这是一个提供播放的设备。
系统会在/proc/asound/pcm文件中列出所有的音频设备的信息,如果是肉眼查看,cat /proc/asound/pcm中的信息会更直观一些:
 

工具

1.tinyplay

1)播放音频文件,并指定声卡

# tinypaly test.wav -D 0 -d 3 -r 48000 -b 16
命令参数

-D     指定声卡
-d     指定设备
-c     指定通道数,1、2
-r    指定速率,16000、44100、48000
-b    指定位数,16、32
-p    指定周期尺寸
-n    指定周期数
-T    指定录制事件

2)使用特定设备播放
# tinycap /sdcard/test.wav -d 1                                              
Capturing sample: 2 ch, 44100 hz, 16 bit
^CCaptured 307200 frames

2.tinycap

1)录制文件,并保存到test.wav文件

# tinycap test.wav -D 0 -d 5 -c 2 -r 48000 -b 16
命令参数

-D     指定声卡
-d     指定设备
-c     指定通道数,1、2
-r    指定速率,16000、44100、48000
-b    指定位数,16、32
-p    指定周期尺寸
-n    指定周期数
-T    指定录制事件
 

2)使用特定设备录音

# tinycap /sdcard/456.wav -d 1

Capturing sample: 2 ch, 44100 hz, 16 bit

3. tinymix

查询音频通路相关的各项配置参数。也可以通过添加参数修改其中的配置。

 # tinymix
ctl     type    num     name                                     value
0       ENUM    1       DACL Input                               ZERO
1       ENUM    1       DACR Input                               ZERO
2       ENUM    1       Mono DAC Input                           ZERO
3       BOOL    2       Stereo DAC Mute                          On On
4       BOOL    1       Mono DAC Mute                            On
5       INT     1       ADC1 Gain                                0
 

4. tinypcminfo

tinypcminfo用于查看pcm通道的相关信息:

5.

audacity工具

参考:

alsa声卡分析alsa-utils调用过程(一)-tinyplay - 腾讯云开发者社区-腾讯云 (tencent.com)

(78条消息) rk音频驱动分析之tinyplay播放_qianxuedegushi的博客-CSDN博客_rk 音频

Audio - 随笔分类 - yooooooo - 博客园 (cnblogs.com)

ALSA声卡驱动的DAPM(一)-DPAM详解 - yooooooo - 博客园 (cnblogs.com)

ALSA声卡驱动的DAPM(二)-建立过程 - yooooooo - 博客园 (cnblogs.com)

ALSA - PCM接口 (magodo.github.io)

(82条消息) 音频帧大小_流樱魔的博客-CSDN博客_音频帧

rk音频驱动分析之tinycap录音 - luoyuna - 博客园 (cnblogs.com)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值