//数据头定义
struct T_RecorderWavHeader
{
//RIFF chunk descriptor 12byte
char riff[4]; // = "RIFF"
uint32_t size_8; // = FileSize - 8
char wave[4]; // = "WAVE"
//fmt sub-chunk 24byte
char fmt[4]; // = "fmt "
uint32_t format_size; // = 过滤字节(一般为00000010H,若为00000012H说明数据头携带附加信息)
uint16_t format_tag; // = 常见的 WAV 文件使用 PCM 脉冲编码调制格式,该数值通常为 1
uint16_t channels; // = 声道个数: 单声道为 1,立体声或双声道为 2
uint32_t samples_per_sec; // = 采样频率 : 8000 | 6000 | 11025 | 16000 | 22050 | 44100
uint32_t avg_bytes_per_sec; // = 数据传输速率(每秒平均字节数):声道数×采样频率×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
// = samples_per_sec * channels * bits_per_sample / 8
uint16_t block_align; // = 每采样点字节数 : 声道数×位数/8。播放软件需要一次处理多个该值大小的字节数据,用该数值调整缓冲区。
// = channels * bits_per_sample / 8
uint16_t bits_per_sample; // = 采样位数: 存储每个采样值所用的二进制数位数, 8 | 16
//data sub-chunk 8byte
char data[4]; // = "data";
uint32_t data_size; // = 纯数据长度 : FileSize - 44
};
// 根据本系统的具体字节序处理的存放格式
#if __BYTE_ORDER == __LITTLE_ENDIAN
//ssss
#define RIFF ('F'<<24 | 'F'<<16 | 'I'<<8 | 'R'<<0)
#define WAVE ('E'<<24 | 'V'<<16 | 'A'<<8 | 'W'<<0)
#define FMT (' '<<24 | 't'<<16 | 'm'<<8 | 'f'<<0)
#define DATA ('a'<<24 | 't'<<16 | 'a'<<8 | 'd'<<0)
#define LE_SHORT(val) (val)
#define LE_INT(val) (val)
#elif __BYTE_ORDER == __BIG_ENDIAN
uuuuu
#define RIFF ('R'<<24 | 'I'<<16 | 'F'<<8 | 'F'<<0)
#define WAVE ('W'<<24 | 'A'<<16 | 'V'<<8 | 'E'<<0)
#define FMT ('f'<<24 | 'm'<<16 | 't'<<8 | ' '<<0)
#define DATA ('d'<<24 | 'a'<<16 | 't'<<8 | 'a'<<0)
#define LE_SHORT(val) bswap_16(val)
#define LE_INT(val) bswap_32(val)
#endif
FILE *g_fp = NULL;
int record_file_open(void)
{
g_fp = fopen("/data/mytest/audio.wav", "wb+");
if (g_fp == NULL)
{
LOGI("Write Error 2");
return 1;
}
fseek(g_fp, 0x00, SEEK_SET);
init_file_head(0x20000);
return 0x00;
}
int record_file_close(void)
{
int file_size;
fseek(g_fp, 0, SEEK_END); //定位到文件末
file_size = ftell(g_fp);
fseek(g_fp, 0x00, SEEK_SET);
init_file_head(file_size);
fclose(g_fp);
system("sync");
return 0;
}
int record_file_write( unsigned char *IN_Data, int IN_Data_Len )
{
int ret;
ret = fwrite(IN_Data, IN_Data_Len, 1, g_fp);
return ret;
}
int init_file_head( int file_size )
{
int size;
struct T_RecorderWavHeader wav_head;
size = sizeof(wav_head);
LOGI("init_file_head init_file_head");
LOGI("size = %#x", size);
memset( &wav_head, 0x00, size );
*(unsigned int *)wav_head.riff = RIFF;
wav_head.size_8 = file_size - 8;
*(unsigned int *)wav_head.wave = WAVE;
*(unsigned int *)wav_head.fmt = FMT;
wav_head.format_size = 0x00000010;
wav_head.format_tag = 0x0001;
wav_head.channels = 0x0001;
wav_head.samples_per_sec = 16000;
wav_head.avg_bytes_per_sec = 32000;
wav_head.block_align = 2;
wav_head.bits_per_sample = 16;
*(unsigned int *)wav_head.data = DATA;
wav_head.data_size = file_size - 44;
record_file_write( &wav_head, size );
}
record_file_write输入sbc解码后的数据流
每次256 bytes,由36字节的压缩音频sbc解码得到
724

被折叠的 条评论
为什么被折叠?



