//数据头定义 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解码得到