Audio参数讲解

19 篇文章 1 订阅
2 篇文章 0 订阅

一、音频基础参数

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ijkplayer的onInfoListener是一个接口,用于监听播放器的一些信息事件,其参数如下: 1. int what:事件类型,可以是以下值之一: - MEDIA_INFO_UNKNOWN:未知信息 - MEDIA_INFO_VIDEO_RENDERING_START:视频渲染开始 - MEDIA_INFO_VIDEO_TRACK_LAGGING:视频跟踪滞后 - MEDIA_INFO_BUFFERING_START:缓冲开始 - MEDIA_INFO_BUFFERING_END:缓冲结束 - MEDIA_INFO_BAD_INTERLEAVING:不良交错 - MEDIA_INFO_NOT_SEEKABLE:不可寻址 - MEDIA_INFO_METADATA_UPDATE:元数据更新 - MEDIA_INFO_TIMED_TEXT_ERROR:定时文本错误 - MEDIA_INFO_UNSUPPORTED_SUBTITLE:不支持的字幕 - MEDIA_INFO_SUBTITLE_TIMED_OUT:字幕超时 - MEDIA_INFO_VIDEO_ROTATION_CHANGED:视频旋转变化 - MEDIA_INFO_AUDIO_RENDERING_START:音频渲染开始 - MEDIA_INFO_AUDIO_DECODED_START:音频解码开始 - MEDIA_INFO_AUDIO_SEEK_RENDERING_START:音频寻址渲染开始 - MEDIA_INFO_AUDIO_FRAME_RENDERING:音频帧渲染 - MEDIA_INFO_VIDEO_DECODED_START:视频解码开始 - MEDIA_INFO_VIDEO_SEEK_RENDERING_START:视频寻址渲染开始 - MEDIA_INFO_VIDEO_FRAME_RENDERING:视频帧渲染 - MEDIA_INFO_OPEN_INPUT:打开输入源 - MEDIA_INFO_FIND_STREAM_INFO:查找流信息 - MEDIA_INFO_COMPONENT_OPEN:组件打开 - MEDIA_INFO_VIDEO_SEI:视频SEI信息 - MEDIA_INFO_AUDIO_SEI:音频SEI信息 2. int extra:额外信息,可以是以下值之一: - MEDIA_INFO_BUFFERING_PERCENTAGE:缓冲百分比 3. Object obj:附加对象,可以是null或者其他类型的对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Free飝Fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值