wav文件生成代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值