1.alsa的音频输出过程

alsa播放音频的原理通过snd_pcm_writei()等函数将音频数据写到alsa的buffer中。alsa启动播放以后,alsa驱动会产生中断,每次中断从buffer中取走period个音频数据帧输出到codec。

2.音频最后的数据不足一个period

alsa驱动从buffer中是按照一个完整的period个数据帧取走数据的,如果取走的一个period数据中,并不都是音频数据,可能有其他脏数据,那就可能在最后一帧产生噪音。

3.具体举一个例子:

  一个音频文件中包含10240个frame音频数据,alsa的硬件参数中period大小设置为1024。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().

ALSA播放时杂音问题相关推荐

  1. 七、解决FFmpeg播放时杂音

    一.播放杂音的原因 音频数据buff的大小不正确 SDL_MixAudio拷贝stream的数据有问题 二.解决方法 1. 音频数据buff的大小不正确(重采样后samples的大小发生了变化) 源代 ...

  2. alsa播放结束时的杂音问题

    alsa的音频输出过程 alsa播放音频的原理通过snd_pcm_writei()等函数将音频数据写到alsa的buffer中.alsa启动播放以后,alsa驱动会产生中断,每次中断从buffer中取 ...

  3. androidwakelock_Android音频播放时wakelock的实现

    音频播放时 wakelock 的实现 作者 :Macro Liu 功能描述 : 当播放音乐时,按电源键只需要进入 early suspend, 以保持音乐播放状态. 实现方法 : 在上层和内核都加 w ...

  4. 计算机上播放时没声音什么故障,事实:在笔记本电脑上播放歌曲时如果没有声音怎么办...

    在笔记本电脑上播放时如果没有声音该怎么办?关于在笔记本电脑上播放时无声音的问题,有些网民仍然不知道该怎么办,所以让我告诉您如何在笔记本电脑上播放无声音时解决问题.希望我能为您服务!播放歌曲时,笔记本电 ...

  5. Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长

    1.复制音频文件到raw文件夹下 2.实例化音频文件 private final MediaPlayer.OnCompletionListener beepListener = new MediaPl ...

  6. C# 获取视频文件播放时长

    以前是用xp (32位)系统,获取视频文件长度是通过调用Shell32.dll来读取文件信息得到的,最近换win7(32位)系统,编译以前的项目代码发现无法读取了,代码没有改动,拿到在xp下运行也不行 ...

  7. 音频播放时,将前台服务和通知栏关闭

    正在播放音频下,退出登录或被挤下线等情况下,就要遇到下列情况 问题:播放时设置服务前台运行,创建一个消息通知栏 service.startForeground(NOTIFICATION_ID, new ...

  8. Potplayer关闭播放时的信息

    Potplayer关闭播放时的信息 https://blog.csdn.net/datou1691/article/details/101549849 https://blog.csdn.net/xu ...

  9. c语言实现alsa播放

    c语言实现alsa播放 c语言实现alsa录音 这个比较简单直接上代码 #include <alsa/asoundlib.h> #include <math.h>#define ...

最新文章

  1. 北京 10 年,难说再见!
  2. 微信小程序API·目录
  3. js 调用父窗口的方法
  4. javascript总结9:JavaScript三目运算符
  5. 测试眉形的有哪个软件_这五款自动化软件测试工具,你最喜欢用哪个?
  6. java rhino_在Java 8中使用Rhino
  7. 打印pdf就一页_Excel表格打印技巧汇总,看完才发现,你连基础打印技巧都不知道...
  8. 作者:刘新海(1976-),男,中国人民银行征信中心副研究员
  9. cefsharp irequesthandler_CefSharp请求资源拦截及自定义处理
  10. 眼睛-摄像 科技-文学
  11. 谈谈技术原则,技术学习方法,代码阅读及其他的(引用)
  12. 【数据分析】你一定要掌握的Python七种数据清洗方法
  13. PYPL 1 月 IDE 榜单:Visual Studio Code 猛追 IntelliJ
  14. Rushcrm:CRM系统中的进销存管理
  15. 如何将优酷独享视频kux格式转换成mp4视频
  16. mousewheel事件
  17. 浙大pat | 浙大pat乙级 1005~1008
  18. MySQL 8.0.29安装版安装教程
  19. SkeyePlayer RTSP播放器源码解析系列之H264一帧多NAL写MP4录像花屏问题解决方案
  20. 51单片机外部中断使用示例程序

热门文章

  1. 用Python给对方发个邮箱就可以使对方自动关机,鬼知道你干了什么?
  2. sersync实时备份安装及设置
  3. 理解 zookeeper
  4. QT Creator 环境使用 remote debug 调试 arm 程序
  5. linux rsync配置文件参数详解
  6. JSP学习笔记1:JSP生命周期
  7. MS-SQL的智能脚本智能提示失效丢失
  8. 2010头号病毒追杀令——恶意下载者001
  9. Kaldi AMI数据集脚本学习7---train_deltas.sh
  10. Deep Learning快速学习方法