Audio参数讲解

一、音频基础参数

frame_bits  一帧数据的位数比如 :16bits 2ch   frame_bits = 16*2
sample_bits 采样位数 比如16bit  24bit  32bit
period_size  指一个周期包含多少帧
periods 每次处理AD/DA转换的间隔周期
内核可以缓冲很多周期的数据,每个周期都会生成一个中断和一个副本,用户层可以间隔很长时间再处理一次,一次可以处理多个周期的数据
buffer_size
= period_size * periods

params_periods 宏从 hw_params 中提取出对应的 periods。

period_bytes_min /* min period size */ 和定义的最小和最大的 period size。
periods_max 和 periods_min 定义了最大和最小的 periods。

periods 信息和 OSS 中的 fragment 相对应。period 定义了 PCM 中断产生的周期。这个周期非常依赖硬件。
一般来说,一个更短的周期会提供更多的中断和更多的控制。如在录音中,周期大小定义了输入延迟,另外,整个缓存区大小也定义了播放的输出延迟。

二、音频硬件参数举例
static const struct snd_pcm_hardware dummy_pcm_hardware = {
    .info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED
        | SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID,
    .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE
            | SNDRV_PCM_FMTBIT_S32_LE,
    .rate_min = 8000,
    .rate_max = 192000,
    .channels_min = 1,
    .channels_max = 16,
    .period_bytes_min = 256,
    .period_bytes_max = 1024 * 16,
    .periods_min = 2,
    .periods_max = 4096,
    .buffer_bytes_max = 1024*1024,
    .fifo_size = 256,
};

应用层pcminfo显示:
Info for card 0, device 1:

PCM out:
      Access:   0x000009
   Format[0]:   0x000444
   Format[1]:   00000000
 Format Name:   S16_LE, S24_LE, S32_LE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=192000Hz
    Channels:   min=1           max=16
 Sample bits:   min=16          max=32
 Period size:   min=4           max=8192
Period count:   min=2           max=4096

PCM in:
      Access:   0x000009
   Format[0]:   0x000444
   Format[1]:   00000000
 Format Name:   S16_LE, S24_LE, S32_LE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=192000Hz
    Channels:   min=1           max=16
 Sample bits:   min=16          max=32
 Period size:   min=4           max=8192
Period count:   min=2           max=4096

上面示例,定义了该I2S支持最大16通道,最小1通道,最大period_bytes 1024*16
不管你是使用1通道还是16通道,最大period_bytes 1024*16 不变。
所以在tinyplay播放1通道和16通道所支持的-p  参数是不同的,注意tinyplay的-p指的是
多少个frame,一个frame大小与通道数和bits都有关系,但需要保证
frames_bytes*period_size = period_bytes不超过1024*16 bytes。
比如播放48K 2ch  32bits音频:-p  最大2048,2048*2ch*(32bites/8) = 1024*16
若播放8ch  32bits  -p  就是512,16ch 32bits就是 256。

说说为什么应用层显示Period size  min=4 max=8192
首先这个地方Period size 单位也是frame的个数
min=4的由来:period_bytes_min = 256,max_ch=16,max_bits=32,所以
Period size  min= 256/16/(32/8) = 4
max=8192的由来:min_ch=1,min_bits=16
Period size  max = 16*1024/1/(16/8) = 8192

由上可知,Period size的范围并不适用所有音频文件,要根据具体音频参数来计算

说说Period count计算:tinypcminfo显示与驱动配置相同
但是具体能支持最大多少Period count,还受其他参数影响
根据上述驱动定义,最大buffer_size = 1024*1024,即1M
需确保period_bytes* Period count <= 1Mbytes
所以当播放48K 2ch 32bits,使用-p 2048时,Period count最大是64

你可能感兴趣的:(Linux,android,Audio,人工智能,python,音视频)