ALSA播放时杂音问题
播放 问题 alsa
2023-09-14 09:16:07 时间
1.alsa的音频输出过程
alsa播放音频的原理通过snd_pcm_writei()等函数将音频数据写到alsa的buffer中。alsa启动播放以后,alsa驱动会产生中断,每次中断从buffer中取走period个音频数据帧输出到codec。
2.音频最后的数据不足一个period
alsa驱动从buffer中是按照一个完整的period个数据帧取走数据的,如果取走的一个period数据中,并不都是音频数据,可能有其他脏数据,那就可能在最后一帧产生噪音。
3.具体举一个例子:
一个音频文件中包含10240个frame音频数据,alsa的硬件参数中period大小设置为10240。buffer大小是5120。那么应用程序通过snd_pcm_writei()每次向buffer中写入1024个frame音频帧,写入10次就将音频文件的数据全部送入到了buffer中(如果buffer没有空间应用会阻塞),然后alsa驱动每次从buffer中取走1024个frame,取走10次,这样音频就正常播放完成了。
但是如果音频文件中包含10246个frame音频数据,输入到buffer中的音频就是10个完整的period帧和一个不完整的只包含6个frame的period帧。所以alsa驱动要取11次才能把所有数据取走,而且最后一个period取走的时候,里面只包含了6个frame数据,其他1018个都是未定义的数据,这时候1018个数据输出到codec那就是产生噪声。如果想避免这个情况,应用层就需要将1018个frame填充为静音数据,然后发送给buffer。这样播放最后一个period的时候就不会有噪声了。生成静音数据的api是snd_pcm_format_set_silence().
相关文章
- EasyPlayer播放H.265视频时,画面出现进度按钮的问题修复
- EasyCVR集群切换服务节点,HIKSDK接入设备出现播放失败是什么原因?
- EasyGBS设备通道播放视频时,双击无法全屏的问题优化
- 猿大师播放器在Chrome播放海康威视RTSP流闪退,用新版VLC播放器播放也闪退,但是用2.24老版本VLC播放器却没问题,该怎么办?
- cefsharp播放视频_flash播放器手机版
- wireshark视频流播放_ffmpeg无缝推流多个视频
- EasyNVR HLS流播放中断是什么原因?该如何解决?
- 国标GB28181协议接入EasyCVR视频融合平台,通道无法播放的原因排查及解决
- 采用H5多屏直播时,H.264和H.265视频流混合播放导致的卡顿问题解析
- mkv格式怎么在mac电脑播放,mac上5款必备的视频播放器
- EasyCVR设备录像因时间导致播放异常问题的排查与解决
- 播放问题Linux下VLC播放异常解决方案(linux下vlc)
- 实现快速、流畅的视频播放体验——VOD Linux(vodlinux)
- 微软正在计划为EDGE浏览器改进视频播放 默认情况下直接阻止自动播放
- Linux下的音乐盛宴:探索尽享乐趣(linux音乐播放)
- android图库播放幻灯片时按power键灭屏再亮屏显示keyguard
- jquery重新播放css动画所遇问题解决