博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux实现音频录放
阅读量:3656 次
发布时间:2019-05-21

本文共 1492 字,大约阅读时间需要 4 分钟。

转自

一、原理简述

在Linux下,录音——从dsp设备读取数据,放音——向dsp设备写入数据。
开发板采用声卡UDA1341实现音频编解码,完成A/D和D/A转换,芯片UDA1341与CPU的连接图如下:
 
为了实现全双工,数据传输需要使用两个DMA通道。以音频回放为例,数据传输先由内部总线送到内存, 然后传到DMA控制器通道1,再通过IIS控制器写入IIS总线并传输给音频芯片,通道2用来录音。
Linux下PCI设备驱动程序之注册详解 http://www.linuxidc.com/Linux/2014-02/97074.htm
裸机驱动与Linux设备驱动的区别 http://www.linuxidc.com/Linux/2013-08/88799.htm
Linux设备驱动开发详解(第2版)源代码 下载 http://www.linuxidc.com/Linux/2013-07/86977.htm
Linux设备驱动开发详解(第2版)高清PDF http://www.linuxidc.com/Linux/2013-07/86976.htm
二、WAV文件
WAVE是录音时用的标准的Windows文件格式,文件的扩展名为“wav”,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种,符合RIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。数据块的记录方式是小端(little-endian)字节顺序,标志符并不是字符串而是单独的符号
以采样率为8kHz,量化位数为16,单通道的record.wav文件为例,文件前三行信息如下:
第一列表示地址,一行表示16个字节。
0x52,0x49,0x46,0x46 //“RIFF”4个字符对应的ASCII码值
0x57,0x41,0x56,0x45,0x66,0x6D,0x74,0x20 //“WAVEfmt ”各个字符对应的ASCII码值
0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00//sizeof(PCMWAVEFORMAT)4Byte,格式类别2B,通道数1B(声道)
0x40,0x1F,0x00,0x00,0x80,0x3E,0x00,0x00, //采样频率0X0001F40= 8kHZ(8000Hz)4B,0x00003E80B/s=16kB/s 4B
0x02,0x00,0x10,0x00,0x64,0x61,0x74,0x61};//数据调整数0x0002(1*16/8)2B,即一个采样点所占的字节数,样本数据位数0x10(16位)2B,即一个采样点所表示的位数 “data”4B
地址000014H~000017H的值:2400 01 00即十六进制0x00010024,对应十进制65572(65536+36),表示从0x08开始到文件尾的总字节数;
地址000028H~00002BH的值:0080 0C 00即十六进制0x00010000,对应十进制65536,表示采样数据总数。
录音测试命令:cat /dev/sound/dsp > audio.wav
使用cat命令生成的audio.wav是一个PCM纯音频文件:
通过添加wav文件头,可以生成一个标准的wav音频文件:
本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2014-06/103570.htm

你可能感兴趣的文章
二进制、十进制、十六进制之间转换
查看>>
BigDecimal加减乘除及比较大小
查看>>
int加char会报错???
查看>>
java内部类使用
查看>>
System.arraycopy()方法
查看>>
JAVA 基础学习之 数组加强和二位数组
查看>>
JAVA 基础学习之 面向对象-类和对象
查看>>
Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) (异或+规律)
查看>>
Codeforces Round #635 (Div. 2) D. Xenia and Colorful Gems(二分)
查看>>
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) B. High Load(树的直径+贪心)
查看>>
Codeforces Round #638 (Div. 2) D. Phoenix and Science(数学+思维)
查看>>
Codeforces Round #576 (Div. 1) C. Matching vs Independent Set(思维好题)
查看>>
Codeforces Round #639 (Div. 2) D. Monopole Magnets(bfs+模拟)(恶心的阅读理解题)
查看>>
一分钟搞懂与、或、非、异或优先级!
查看>>
CodeBlocks无法编译的解决方案
查看>>
关于ZigBee的学习笔记1.0
查看>>
秒懂!用通俗的话讲解“ZigBee终端节点入网”过程
查看>>
完美解决:Ubuntu 12.04右键没有打开终端选项
查看>>
快速理解:memmove和memcopy的区别
查看>>
strsep函数详解
查看>>