linux pcm接口调试,Linux的alsa接口播放pcm音频数据
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音频数据相关推荐
- linux问号符号,调试linux内核时gdb中的问号符号4.10
我想从linux内核中的函数start_kernel()调试linux内核.调试linux内核时gdb中的问号符号4.10 这基本上就是我已经做了 从kernel.org 下载4.10内核源提取源后: ...
- linux内核单步调试,Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)
如何单步调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大.逻辑复杂.与硬件交互的特性.因此,有着不同于应用程序的调试方法,据统计Linux内核开 Linux内核驱动开发之KGDB原 ...
- linux内核单步调试,linux内核调试之KDB(1)
说到linux调试人们第一想到的就是GDB,GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,想必大家都比较熟悉,但是在调试模块时缺少一些至关重要的功能,它可用来查看内核的运行情况,包括 ...
- linux子系统gdp调试,Linux系统中GDB功能汇总
在Linux系统操作中,GDB是一款程序调试工具,且拥有多种功能,下面小编将针对GDB的功能给大家做个详细介绍,以便你对GDB有个详细的了解. 或许,各位比较喜欢那种图形界面方式的,像VC.BCB等I ...
- qemu debug linux内核,qemu调试linux内核
2012.03.19 网上时间过早的讲编译内核的文章完全不用看,比如什么讲kgdb的,现在这个东西早就被集成到内核里了.还有调试内核的一些允许kernel debugging的选项,在新版本中也早已是 ...
- linux系统 qt调试,Linux下Qt Creator远程调试(redhat5+mini6410)
当我们开发嵌入式系统下的Qt应用程序时,有时候不能在虚拟机上进行调试,这时候我们需要通过远程调试的方式在PC上调试嵌入式系统下的Qt应用程序.这样就产生了交叉调试. 本文环境介绍: 虚拟机:vmwar ...
- linux中多进程调试,linux下用gdb调试多进程
今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表: 这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的. 一.多进程调试的命令 1.set follo ...
- linux子系统gdp调试,Linux GDB调试 详述
今天来分享下gdb的简单调试,我这里写了个例子 三个.c文件 func1.c func2.c main.c 首先生成可调试的执行文件 gcc -g func1.c func2.c main.c -o ...
- linux内核串口调试,linux 串口调试方法
linux 串口调试方法 作者:syhdjf 发布于:2015-4-8 16:41 最近项目上用到linux下的串口,与下级模块的通信出了些问题,所以写了个小程序想要测试下串口,物理连接是PC端串口调 ...
最新文章
- 在idea中移除子模块Moudle后重新导入
- Java基础之Switch语句
- 和 Gmail 先生面对面
- Android --- 选项卡背景样式,左侧边有颜色
- 2022-02-25
- 2020 年国内 Serverless 用户规模:阿里云占比第一,达 66%
- ncbi查找目的基因序列_教你如何利用NCBI寻找目的基因
- Flex网站作品“妙句网”简化版推出(服务端为.Net WebService)
- Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Latin1_General_100...
- 创建前缀一样的文件_SpringBoot:配置文件属性读取
- 基于 .Net5.0 的快速开发框架,YuebonCore1.0.3 版已发布
- 查看eclipse中项目部署位置
- 网上图书商城项目学习笔记-034订单管理
- 洛谷P1136 迎接仪式
- VS中使用码云gitee建立源代码管理
- mbr linux安装分区,linux – 在MBR扇区上安装GRUB或在启动分区上安装第一个扇区之间的区别?...
- lighttpd,nginx,apache的性能负载比较
- 用什么软件可以检测苹果耳机芯片_苹果耳机AirPods入耳检测的原理!怎么样判断苹果耳机的真假?...
- 台式计算机怎么开声音,台式电脑没有声音怎么办
- js面试必备:原形链
热门文章
- 老男孩Python9期全套视频
- AlgaEnergy与横河电机签署战略伙伴关系和股权协议,以加速微藻生物技术的发展
- 2001-2021年全国30省就业人数数据
- js打乱数组内元素顺序(Fisher–Yates shuffle洗牌算法)
- python编程导论_Python编程导论(第2版)
- pandas-新手使用教程
- docker galaxy_前Galaxy Note 7车主可以在Note 8上获得大量优惠
- 新版中日交流标准日本语初级第八课之基本课文I
- 防止网页被盗用 网页加密完全攻略
- 制作目标检测数据集入门到精通(一)常用数据集(及下载数据网站)汇总