当前位置:首页 > 单片机 > 单片机
[导读]S3C2416裸机开发系列十九_Fatfs下播放录音wav音频文件标签:wavfatfs音频播放s3c2416sd驱动2014-06-11 09:551938人阅读评论(0)收藏举报分类:s3c2416裸机开发(24)版权声明:本文为博主原创文章,未经博主允许不得转

S3C2416裸机开发系列十九_Fatfs下播放录音wav音频文件

标签:wavfatfs音频播放s3c2416sd驱动

2014-06-11 09:551938人阅读评论(0)收藏举报

分类:

s3c2416裸机开发(24)

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

S3C2416裸机开发系列十九Fatfs下播放录音wav音频文件

象棋小子 1048272975

对于多媒体资源,一般都是以文件的形式存储在固化存储器中。Fatfs所支持的fat32为windows支持的文件系统,因此在嵌入式系统中采用Fatfs文件系统可极大地扩展系统的应用。例如,把计算机上图片,音频,视频,文本等资源直接拷贝到嵌入式系统中的固化存储器中,在系统中即可直接应用这些资源。把嵌入式系统中录制的音频、视频直接保存成一定的格式,在计算机上可直接播放处理,把传感器采集的数据保存成txt或dat文件,在计算机上通过处理生成数据曲线分析等。笔者此处就wav音频文件的播放与录音进行简单的介绍。

1. wav音频格式

Wave是录音时用的标准windows文件格式,文件扩展名为”.wav”,数据本身的格式为PCM或压缩型,它是由微软与IBM联合开发的用于音频数字存储的标准,采用RIFF文件格式结构。

RIFF全称资源互换文件格式,是windows下大部分多媒体文件遵循的一种文件结构,除了本文所说的波形格式数据(.wav),采用RIFF格式结构的文件还有音频视频交错格式(.avi)、位图格式(.rdi)、MIDI格式(.rmi)、调色板格式(.pal)、多媒体电影(.rmn)、动画光标(.ani)。

RIFF结构的基本单元为chunk,它的结构如下:

struct chunk {

unsignedint id; /* 块标志 */

unsignedint size; /* 块大小 */

unsigned chardata[size]; /* 块内容 */

}

Id为4个ascii字符组成,用来识别块中所包含的数据,如”RIFF”、”WAV ”、”data”、”fmt ”等;size是存储在data域中数据的长度,不包括id与size域的大小;data[size]为该块保存的数据,以字为单位排列。

wav音频文件作为RIFF结构,其由若干个chunk组成,按照在文件中的位置包括:RIFF chunk,fmt chunk,fact chunk(可选),data chunk。所有RIFF结构文件均会首先包含RIFF chunk,并指明RIFF类型,此处为”WAVE”。对于wav文件,在fmt chunk中指明音频文件的信息,例如采样位数、采样频率、声道数、编码方式等。对于压缩型wav音频,还会有一个fact chunk,用以指明解压后音频数据的大小,对于PCM非压缩wav文件,并没有该chunk。音频数据保存在data chunk中,根据fmt chunk中指明的声道数以及采样位数,wav音频数据存放形式有不同的方式。

一个PCM格式的wav结构定义Wav.h如下:

#ifndef __WAV_H__

#define __WAV_H__

#ifdef __cplusplus

extern "C" {

#endif

//资源互换文件格式RIFF,树状结构,基本单位是chunk,整个文件由chunk构成

typedef struct RIFF_HEADER {

char Riff_ID[4];

unsigned int Riff_Size;//记录整个RIFF文件的大小,除ID和Size这两个变量

char Riff_Format[4];

} RIFF_HEADER;

typedef struct WAVE_FORMAT {

unsigned short FormatTag; //声音的格式代号

unsigned short Channels; //声音通道

unsigned int SamplesPerSec; //采样率

unsigned int AvgBytesPerSec; //=采样率*区块对其单位

unsigned short BlockAlign; //区块对其单位=每个取样所需位数*声音通道/8

unsigned short BitsPerSample; //每个取样所需位数

} WAVE_FORMAT;

typedef struct FMT_CHUNK {

char Fmt_ID[4];

unsigned int Fmt_Size;//记录fmt的大小

WAVE_FORMAT WaveFormat;

} FMT_CHUNK;

typedef struct DATA_CHUNK {

char Data_ID[4];

unsigned int Data_Size;//记录data区的大小

} DATA_CHUNK;

typedef struct WAVE_HEADER {

RIFF_HEADER RiffHeader;

FMT_CHUNK FmtChunk;

DATA_CHUNK DataChunk;

} WAVE_HEADER;

#ifdef __cplusplus

}

#endif

#endif /*__WAV_H__*/

根据以上的wav结构定义,一个录音文件的wav文件头可如下定义:

static WAVE_HEADER RecorderWaveHeader = {

'R', 'I', 'F', 'F',

sizeof(WAVE_HEADER) - 8,//整个wave文件大小,初始化值

'W', 'A', 'V', 'E',

'f', 'm', 't', ' ',

sizeof(FMT_CHUNK) - 8,

1,//编码方式,线性PCM编码

1,//单声道

10000,//采样率为10k

20000,//每个采样2个字节

2,//每个采样2个字节

16,//每个采样需16位

'd', 'a', 't', 'a',

0, //data长度初始化为0

};

2. wav音频文件的播放或录音

sd卡由于其可插拔、灵活性好,通常应用于设备的扩展存储应用。计算机上wav音频等文件可轻易地拷贝到fat32格式的sd卡上,在嵌入式系统中要使用sd卡,首先需实现sd卡驱动,这在前面的章节有详细的介绍,此处不再详述。fat32文件的读写还需要相应文件系统的接口支持,此处选用Fatfs,对于不同的嵌入式系统,这是需要移植的部分,关于s3c2416下Fatfs文件系统的移植在前面章节有详细的介绍,此处不再详述。从wav文件读出音频数据后(播放),还需要把音频数据传输给声卡,声卡还原出声音模拟信号,即可听到声音。音频数据的处理需要用到音频编解码器,数据的传输也有一定的音频总线要求,因此还需要音频驱动的实现,这部分在前面的章节有详细的介绍,此处不再详述。

3. 应用实例

工程中利用串口对耳机音量进行加大、调小,对Mic录音进行灵敏度的调节,通过串口输入进行播放wav音频或开始录音。播放时实时显示播放进度并可按下’s’后停止播放,录音时实时显示录音wav文件的大小并可按下’s’后停止录音。

main.c的内容如下:

#include"s3c2416.h"

#include"UART0.h"

#include"ff.h"

#include"diskio.h"

#include "RTC.h"

#include"Wav.h"

#include"IIS.h"

#include"IIC.h"

#include"WM8960.h"

staticWAVE_HEADER RecorderWaveHeader = {

'R', 'I', 'F', 'F',

sizeof(WAVE_HEADER) - 8,//整个wave文件大小

'W', 'A', 'V', 'E',

'f', 'm', 't', ' ',

sizeof(FMT_CHUNK) - 8,

1,//编码方式,线性PCM编码

1,//单声道

10000,//采样率为10k

20000,//每个采样2个字节

2,//每个采样2个字节

16,//每个采样需16位

'd', 'a', 't', 'a',

0, //data长度初始化为0

};

// 音频数据缓存20KB

unsigned charAudioBuffer[20*1024];

int main()

{

FATFS fs;

FIL file;

FRESULT Res;

unsigned int i;

unsigned int BufferLen;

unsigned char *pData;

WAVE_HEADER WaveHeader;

int ByteWrite, ByteRead;

unsigned char State;

unsigned char VolumeLevel;

unsigned short Command;

const char Path1[] = "test.wav";

const char Path2[] = "1.wav";

char FilePath[256];

unsigned int Size = 0;

unsigned int AudioSize = 0;

unsigned int TotalSize = 0;

RTC_Time Time = {

2014, 5, 22, 23, 00, 0, 5

};

RTC_Init(&Time); // RTC初始化

Uart0_Init(); // 串口初始化

IIC_Init(); //IIC初始化,音频芯片控制

IIS_Init(); // IIS音频接口初始化

WM8960_Init(); // 音频编解码器初始化

RTC_GetTime(&Time); // 显示RTC时间

Uart0_Printf("Time: %4d/%02d/%02d%02d:%02d:%02drn", Time.Year,

Time.Month, Time.Day, Time.Hour,Time.Min, Time.Sec);

f_mount(&fs, "" , 0);

ByteRead = 0;

pData = (unsigned char *)0;

for (i=0; i

FilePath[i] = Path1[i];

}

State = 1; // 进入播放test.wav状态

while(1) {

switch (State) {

case 0: // 操作选择

WM8960_HeadphoneStop();

WM8960_RecorderStop();

IIS_TxPause();

IIS_RxPause();

Uart0_SendString("rnSelect:rn"

"0: Play test.wavrn"

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭