tinyalsa(0)

张开发
2026/4/20 4:50:20 15 分钟阅读

分享文章

tinyalsa(0)
先给你一个完整配置采样率rate 48000 声道数channels 2左右声道 采样格式 16bit2字节 period_size 480 period_count 4一、先从“声音本质”开始最重要声音在数字世界里其实是很多“时间点”的采样值拼起来的二、一个时间点发生了什么假设现在是某一瞬间左声道 1000 右声道 1200这一瞬间的数据就是[1000, 1200]三、frame 是什么关键突破点把刚才这一瞬间的数据打包frame [左声道, 右声道]所以1 frame 一个时间点 所有声道的数据四、采样率rate是什么rate 48000意味着每秒有 48000 个这样的 frame五、采样格式format是什么16bit 2字节每个声道的一个 sample 用 2 字节表示六、声道数channelschannels 2每个 frame 有两个 sampleframe 左 右七、算一下一个 frame 多大frame_size channels × 每个sample字节数 2 × 2 4字节八、把时间展开1 秒钟的数据48000 frame每个 frame 4 字节总数据 48000 × 4 192000 字节 ≈ 187.5KB九、period 是什么很多人卡这里period 是一小块连续的 frame在你的配置里period_size 480 frame换算时间480 / 48000 0.01 秒 10ms意味着每 10ms 是一小块数据十、period_count 是什么period_count 4意味着buffer 里一共有 4 块这样的 period十一、buffer 是什么buffer period_size × period_count 480 × 4 1920 frame十二、现在把所有东西串起来核心1 秒钟48000 frame每 10ms一个 period480 framebuffer 总共1920 frame 40ms 的音频十三、用“流水线”理解最推荐过程是这样的① 应用程序不断生成音频数据frame↓② 写入 ALSA buffer按 period 一块一块写↓③ 声卡按固定速度读取48000 frame/s↓④ 播放出来十四、用一句话把所有参数串起来你现在可以这样理解1 frame 一个时间点的所有声道数据 rate 每秒多少个时间点 format 每个数据点多大 channels 每个时间点有多少数据 period_size 一次处理多少个时间点 period_count 一共有多少块这样的数据十五、一个“完整画面”建议你脑补这个时间轴 → [frame][frame][frame] ... 每秒48000个 分块 [480 frame] | [480 frame] | [480 frame] | [480 frame] period1 period2 period3 period4 总 buffer 1920 frame十六、你现在真正缺的是这个“感觉”当你看到period_size 480你要立刻想到“这是 10ms 的音频”看到buffer 1920想到“这是 40ms 的排队音频”最后一句总结非常重要这些参数本质上都在描述三件事时间被切成多少份rate / frame每一份有多少数据channels / format一次处理多少份、缓存多少份period / buffer

更多文章