[Android Audio] AudioTrack

两种模式:

AudioTrack 处理 音频时会分为两种模式 : 直通 和 非直通。

AudioTrack 场景下,PCM 数据(8bit /16bit/24bit/32bit)被定义为非直通模式 ,非 pcm 数据 (aac/eac3/ac3/pcma/...) 被定义为直通模式。

直通模式是应用层对于平台层如何处理 audio 数据的要求,潜台词是这些数据不要进行任何后期处理,不管音质好坏,直接解码后送到音频输出设备里播放。并不是说直通模式一定是 非pcm 数据,而非直通模式就一定是 pcm 数据,是否直通只是说 应用层对于数据处理的期望。只不过在 Android AudioTrack 中,PCM 数据被划归为非直通模式,非PCM数据被划归为直通模式。

audio frame 的定义:

一起被处理的数据单元叫做帧,比如因为网络原因导致数据分片不能叫做一个帧,因为不会被昨晚一个单元被处理,而是要聚合到一起被处理。音频帧的数据也适用此定义。

frame = 一个采样的字节数 * channelcnt

1)直通模式下,一个字节或者说 8bit 为一个 frame ;即一个字节是一帧。

2)非直通模式下,channle count * nbit / 8 (字节)是一个 frame,比如 双通道16比特采样深度的 pcm 流的 一个 frame 是 2*16/8 = 4 字节。即最小时间单位(采样率的倒数)播放的字节数为一帧。

例:

44100采样率 / 2 channel /16bit采样深度

44100个采样点,占用时间为 1s

44100个frame,占用时间为0.5s

44100个字节,单通道为 22050字节,每个采样点深度为2字节,因此有 22050/2 = 11025 个采样点,占用时间为 11025/44100 = 0.25s

注意:采样率只表示采样次数,和通道数无关。

如果是2通道,那么44100采样率一秒钟的数据量为 44100*2通道*2字节采样深度 = 176400字节。

如果是4声道,那么每一个采样点有 4*2 = 8字节的数据,因此一秒钟的数据量为 44100 * 8 = 352800 字节。

播放时长的计算方式:

Audio 没有 fps 的概念,因此无法通过 总帧数 除以 fps 来获取当前已经播放了多少秒,那么如何获取 audio 当前的时间戳信息呢? 可以在 audiosink 处记录播放的总 sample 数或者总字节数来计算,audio 是以采样率 sample rate 来作为采样数和时间的关联标准的。

总播放时长 = 总播放采样个数 / 采样率 / 通道数

比如:双通道,已经通过audiosink 播放了4800000个采样点 / 每秒钟采样48000个采样点 / 2  = 共播放50 秒

由于pcm数据是有采样深度的,比如16bit的pcm的每个采样点为2个字节大小,因此也可以通过已经播放的pcm数据的字节数来计算一共播放了多久的audio。

总播放时长 = 总播放字节数 / pcm采样深度 / 采样率 / 通道数

比如:双通道,audiosink播放了 960000 个字节的 16bit pcm 数据,那么相当于播放了 960000/2/2 = 240000 个采样点。那么就相当于播放了 5 秒的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值