C输出Wav文件没有产生任何声音

时间:2014-12-26 12:29:30

标签: c audio

我尝试创建一个产生10秒C音符的c代码。但似乎输出.wav文件没有产生任何声音。

我仍然是C编程的新手,如果你可以指出我的错误会很有帮助。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

//music note
#define C 261.6256

#define TIME 10
#define POINT 20
#define AMP 10000
#define c 5

//wav file header
typedef struct
{
    char ChuckID[4];
    unsigned long ChuckSize;
    char format[4];
    char subChunk1ID[4];
    unsigned long SubChunk1Size;
    unsigned short AudioFormat;
    unsigned short NumChannels;
    unsigned long SampleRate;
    unsigned long ByteRate;
    unsigned short block_allign;
    unsigned short bits_per_sample;
    char data[4];
    unsigned long data_size;

    /*char  riff_tag[4];
    int     riff_length;
    char    wave_tag[4];
    char    fmt_tag[4];
    int     fmt_length;
    short   audio_format;
    short   num_channels;
    int     sample_rate;
    int     byte_rate;
    short   block_align;
    short   bits_per_sample;
    char    data_tag[4];
    int     data_length;*/
} wavheader;

int main(int argc, char **argv)
{
    wavheader wave = {"RIFF",1764036,"WAVE","fmt",16,1,1,44100,176400,4,32,"data",1764000};

    float data;
    float f = C;
    int fs = 44100;
    int k;
    float *buff;

    FILE *out_file = fopen("ongaku.wav","w");
    buff = (float*)malloc(sizeof(float)*fs*TIME);

    for (k = 0; k<(int)(TIME*fs); k++)
    {
        data=AMP*sin(2*M_PI*f*k/fs);
        //printf("%f\n",data);
    }

    fwrite(buff,sizeof(float),fs*TIME,out_file);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

将一些数据放入buff中,我猜你的数据变量保持该值。在那之后 如果其他一切正常,请使用

fflush(out_file);

或使用

fclose(out_file);

答案 1 :(得分:1)

我使用8位数据,但12/16位,更不用说float数据不成功。有一件事是必不可少的,就是不要在标题中硬编码缓冲区大小。需要注意的其他要点是endian-ness(我碰巧不需要调整)和结构打包(同上)。在处理12位数据时,我对BPS/8的使用也会失效。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define FREQ    261.6256    // C
//#define FREQ    440.0       // A
#define M_PI    3.14159265358979323846
#define TIME    10
#define AMP     64.0        // don't use max volume
#define MID     128.0       // 8-bit is range 0..255
//#define MID   0.0         // 16-bit is range -32767.. 32767
#define BPS     8
#define CHANNS  1
#define RATE    44100

//wav file header
typedef struct {
    char ChuckID[4];
    unsigned long ChuckSize;
    char format[4];
    char subChunk1ID[4];
    unsigned long SubChunk1Size;
    unsigned short AudioFormat;
    unsigned short NumChannels;
    unsigned long SampleRate;
    unsigned long ByteRate;
    unsigned short block_allign;
    unsigned short bits_per_sample;
    char data[4];
    unsigned long data_size;
} wavheader;

int main(int argc, char **argv)
{
    int k, samples = RATE * TIME;
    double data;
    FILE *out_file;
    unsigned char *buff;
    wavheader wave = {
        "RIFF",
        36 + samples * CHANNS * BPS/8,
        "WAVE",
        "fmt ",         // "fmt" was error in OP
        16, 
        1,
        CHANNS,
        RATE,
        RATE * CHANNS * BPS/8,
        CHANNS * BPS/8,
        BPS,
        "data",
        samples * CHANNS * BPS/8 
        };

    buff = malloc(BPS/8 * samples);
    out_file = fopen("ongaku.wav","w");
    fwrite(&wave, sizeof(wave), 1, out_file);
    for (k=0; k<samples; k++) {
        data = MID + AMP * sin(2 * M_PI * FREQ * TIME * k / (double)samples);
        buff[k] = (unsigned char)floor(data+0.5);
    }
    fwrite(buff, BPS/8, samples, out_file);
    fclose (out_file);
    free (buff);
    return 0;
}