ALSA框架,是Linux的音频接口,包括alsa驱动程序和用户API(asound库)。

alsa驱动程序,是Linux内核给声卡驱动程序提供的标准。

用户API,是Linux给需要声音的播放和采集功能的用户程序提供的标准。

著名的SDL库的声音播放,在Linux上就是调用了alsa API。

更早的时候Linux声音框架还有oss,现在已经基本不用了。

alsa头文件在/usr/include/alsa目录,代码里只需要包含asoundlib.h就行,其他的头文件都包含在这个里了。

主要的函数都在下图的pcm.h文件里。

下图来自pcm.h文件,alsa函数和数据结构的前缀都是snd开头,pcm相关的就是snd_pcm_。

PLAYBACK表示播放,CAPTURE表示采集,就这两种模式。

声音的格式很多,但在播放采集阶段常用的只有133行的SND_PCM_FORMAT_S16_LE。

它的每个采样点占2个字节,如果是双声道要乘以2占4个字节,这种格式的PCM数据大小就是:采样点数 * 声道数 * 2。

nb_samples * channels * 2。

ffmpeg里面默认解码后的音频数据是FLTP,在播放之前要加一个AVFilter转换,或者使用swr_convert()函数转换。

使用Linux alsa API播放PCM的步骤,接下来的代码来自alsa官网的例子,官网地址www.alsa-project.org。

这类API的使用步骤,与文件差不多,也是打开、设置参数、读取或写入数据、关闭。

1,用snd_pcm_open()打开声音设备,

第一个是传出参数,返回snd_pcm_t的指针,代表打开的一个PCM设备。

第二个是要打开的设备名字,具体的名字参考下图,我电脑的是plughw:0, 0。

第三个参数,表示数据的传输方向,播放是PLAYBACK,采集是CAPTURE。

这个例子里是PLAYBACK。

最后一个表示非阻塞、异步标示,同步模式设为0。

2,设置相关的播放参数,

首先申请一个参数的结构体,

snd_pcm_hw_params_t。

然后设置格式sample_fmt、采样率sample_rate、声道数channels。

数据一般是交错模式,如果是2个声道,先是同一个采样点的左右声道数据,然后是下一个采样点,...。

37行的RW_INTERLEAVED表示交错。

设置完之后使用snd_pcm_hw_params()更新参数,然后释放申请的参数结构。

3,使用snd_pcm_prepare()函数启动设备,然后把存在文件里的pcm数据写入设备,就可以在耳机里听到声音了。

写数据使用snd_pcm_writei()函数,它的第三个参数是采样点数,不是数据的字节数。read()的返回值在单声道时除以2,双声道时除以4。

AAC解码获得的pcm,一般以1024个采样点为一组写入。

mp3解码的pcm,记得是1152个一组。

这里搞错了会有杂音的,如果随便选择组的大小,会听到特别刺耳的声音。

声音的播放是按采样率的,必须连续的写入数据,一旦出现停顿就有杂音了。

人的耳朵对这种杂音特别的灵敏:(

ALSA采集声音的代码,与这个例子差不多,只是改成CAPTURE,使用读函数

snd_pcm_readi()就行。

举报/反馈

linux pcm接口调试,Linux的alsa接口播放pcm音频数据相关推荐

  1. linux问号符号,调试linux内核时gdb中的问号符号4.10

    我想从linux内核中的函数start_kernel()调试linux内核.调试linux内核时gdb中的问号符号4.10 这基本上就是我已经做了 从kernel.org 下载4.10内核源提取源后: ...

  2. linux内核单步调试,Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)

    如何单步调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大.逻辑复杂.与硬件交互的特性.因此,有着不同于应用程序的调试方法,据统计Linux内核开 Linux内核驱动开发之KGDB原 ...

  3. linux内核单步调试,linux内核调试之KDB(1)

    说到linux调试人们第一想到的就是GDB,GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,想必大家都比较熟悉,但是在调试模块时缺少一些至关重要的功能,它可用来查看内核的运行情况,包括 ...

  4. linux子系统gdp调试,Linux系统中GDB功能汇总

    在Linux系统操作中,GDB是一款程序调试工具,且拥有多种功能,下面小编将针对GDB的功能给大家做个详细介绍,以便你对GDB有个详细的了解. 或许,各位比较喜欢那种图形界面方式的,像VC.BCB等I ...

  5. qemu debug linux内核,qemu调试linux内核

    2012.03.19 网上时间过早的讲编译内核的文章完全不用看,比如什么讲kgdb的,现在这个东西早就被集成到内核里了.还有调试内核的一些允许kernel debugging的选项,在新版本中也早已是 ...

  6. linux系统 qt调试,Linux下Qt Creator远程调试(redhat5+mini6410)

    当我们开发嵌入式系统下的Qt应用程序时,有时候不能在虚拟机上进行调试,这时候我们需要通过远程调试的方式在PC上调试嵌入式系统下的Qt应用程序.这样就产生了交叉调试. 本文环境介绍: 虚拟机:vmwar ...

  7. linux中多进程调试,linux下用gdb调试多进程

    今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表: 这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的. 一.多进程调试的命令 1.set follo ...

  8. linux子系统gdp调试,Linux GDB调试 详述

    今天来分享下gdb的简单调试,我这里写了个例子 三个.c文件 func1.c func2.c main.c 首先生成可调试的执行文件 gcc -g func1.c func2.c main.c -o ...

  9. linux内核串口调试,linux 串口调试方法

    linux 串口调试方法 作者:syhdjf 发布于:2015-4-8 16:41 最近项目上用到linux下的串口,与下级模块的通信出了些问题,所以写了个小程序想要测试下串口,物理连接是PC端串口调 ...

最新文章

  1. 在idea中移除子模块Moudle后重新导入
  2. Java基础之Switch语句
  3. 和 Gmail 先生面对面
  4. Android --- 选项卡背景样式,左侧边有颜色
  5. 2022-02-25
  6. 2020 年国内 Serverless 用户规模:阿里云占比第一,达 66%
  7. ncbi查找目的基因序列_教你如何利用NCBI寻找目的基因
  8. Flex网站作品“妙句网”简化版推出(服务端为.Net WebService)
  9. Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_100...
  10. 创建前缀一样的文件_SpringBoot:配置文件属性读取
  11. 基于 .Net5.0 的快速开发框架,YuebonCore1.0.3 版已发布
  12. 查看eclipse中项目部署位置
  13. 网上图书商城项目学习笔记-034订单管理
  14. 洛谷P1136 迎接仪式
  15. VS中使用码云gitee建立源代码管理
  16. mbr linux安装分区,linux – 在MBR扇区上安装GRUB或在启动分区上安装第一个扇区之间的区别?...
  17. lighttpd,nginx,apache的性能负载比较
  18. 用什么软件可以检测苹果耳机芯片_苹果耳机AirPods入耳检测的原理!怎么样判断苹果耳机的真假?...
  19. 台式计算机怎么开声音,台式电脑没有声音怎么办
  20. js面试必备:原形链

热门文章

  1. 老男孩Python9期全套视频
  2. AlgaEnergy与横河电机签署战略伙伴关系和股权协议,以加速微藻生物技术的发展
  3. 2001-2021年全国30省就业人数数据
  4. js打乱数组内元素顺序(Fisher–Yates shuffle洗牌算法)
  5. python编程导论_Python编程导论(第2版)
  6. pandas-新手使用教程
  7. docker galaxy_前Galaxy Note 7车主可以在Note 8上获得大量优惠
  8. 新版中日交流标准日本语初级第八课之基本课文I
  9. 防止网页被盗用 网页加密完全攻略
  10. 制作目标检测数据集入门到精通(一)常用数据集(及下载数据网站)汇总