网站建设通查询,品牌网官网,秦皇岛市教育考试院官网,wordpress 模板 中文乱码最近处理音频的问题#xff0c;所以看了一些不错的文章#xff0c;整理一些有用的资料出来#xff0c;有需要的可以收藏。ALSA的框架图#xff1a;这个图可以说是我目前看到最不错的#xff0c;我发现很多应用开发的#xff0c;一出现解决不了的问题#xff0c;或者奇怪…最近处理音频的问题所以看了一些不错的文章整理一些有用的资料出来有需要的可以收藏。ALSA的框架图这个图可以说是我目前看到最不错的我发现很多应用开发的一出现解决不了的问题或者奇怪的问题就会怀疑内核所以对alsa架构的理解一定会对你有帮助的。内核有一个ringbuffer来存储应用的数据然后再通过DMA和ADC或者DAC通信我们在内核基础上开发ALSA应用是有很多接口来读取、控制ALSA的接口。ringbuff的大小以及ringbuff的读写指针位置以及ringbuff剩余空间大小有对应的设备节点来读取。除了上面的STATUS还有两个可以查看的参数rc snd_pcm_hw_params(handle, hw_params);和snd_pcm_sw_params(handle, sw_params)这些参数的解释period_size每次传输的音频数据大小字节数如果是非阻塞播放的话这个值越小那每次给内核ringbuff传数据就越小那CPU占用率就越大当然系统的音频延时也就越小了。 period_count缓之冲区period的个数。start_threshold从应用传输数据到内核后缓冲区的数据超过这个值时DMA开始启动传输。如果设置的值太大那数据量很小的时候DMA就不启动发送数据给Codec导致音频数据播放不出来这个值建议是越小越好。 stop_threshold缓冲区空闲区大于该值时硬件停止传输。默认情况下这个数 为整个缓冲区的大小即整个缓冲区空了就停止传输。但偶尔的原因导致缓冲区空 如CPU忙增大该值继续播放缓冲区的历史数据而不关闭再启动硬件传输(一般此时有明显的声音卡顿)可以达到更好的体验。 silence_threshold这个值还不是很清楚他的用途有知道的可以留言解释下。avail_min缓冲区空闲区大于该值时pcm_mmap_write()才往缓冲写数据。这个 值越大往缓冲区写入数据的次数就越少面临XRUN的机会就越大。获取ringbuff中的缓存值这是最近遇到的一个问题这持续播放的时候我使用snd_pcm_avail函数读取内核缓存的值发现随着系统的运行这个值就越来越小那就说明我们系统在运行中的时候有累积的一些数据没有得到播放。关于这个函数的解释https://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#ga577b4d51e08d94930a05bbe73291ed2a中文意思对于录音是当前可以读取的音频字节数。对于播放是当前可以写的音频字节数如果内核的缓存越来越小这个值也会越来越小。搞音频的可以看看这几个博客https://zhuanlan.zhihu.com/p/537562136https://www.cnblogs.com/cslunatic/p/3677729.html