Skip to content

Instantly share code, notes, and snippets.

@kaaaaai
Last active August 14, 2023 06:44
Show Gist options
  • Select an option

  • Save kaaaaai/032c20e329f3240a5f507ebd4af0dbb2 to your computer and use it in GitHub Desktop.

Select an option

Save kaaaaai/032c20e329f3240a5f507ebd4af0dbb2 to your computer and use it in GitHub Desktop.

Revisions

  1. kaaaaai renamed this gist Aug 14, 2023. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. kaaaaai created this gist Aug 14, 2023.
    52 changes: 52 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@
    // 假设有一个名为 "floatArray" 的 float 数组和 "arrayLength" 表示数组长度

    NSString *filePath = @"/path/to/file.wav"; // 指定保存 WAV 文件的路径

    // 打开文件用于写入
    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
    [outputStream open];

    // 构建 WAV 文件头信息
    // WAV 文件头的具体格式请根据需要进行调整,以下示例仅提供基本结构
    // 更多关于 WAV 文件格式的信息可以参考相应的规范

    // WAV 文件头信息
    struct {
    char chunkID[4];
    uint32_t chunkSize;
    char format[4];
    char subchunk1ID[4];
    uint32_t subchunk1Size;
    uint16_t audioFormat;
    uint16_t numChannels;
    uint32_t sampleRate;
    uint32_t byteRate;
    uint16_t blockAlign;
    uint16_t bitsPerSample;
    char subchunk2ID[4];
    uint32_t subchunk2Size;
    } wavHeader;

    // 填充 WAV 文件头信息
    memcpy(wavHeader.chunkID, "RIFF", 4);
    wavHeader.chunkSize = sizeof(wavHeader) - 8 + arrayLength * sizeof(float);
    memcpy(wavHeader.format, "WAVE", 4);
    memcpy(wavHeader.subchunk1ID, "fmt ", 4);
    wavHeader.subchunk1Size = 16;
    wavHeader.audioFormat = 3; // IEEE float
    wavHeader.numChannels = 1; // 单声道
    wavHeader.sampleRate = 44100; // 采样率
    wavHeader.byteRate = wavHeader.sampleRate * sizeof(float);
    wavHeader.blockAlign = sizeof(float);
    wavHeader.bitsPerSample = sizeof(float) * 8;
    memcpy(wavHeader.subchunk2ID, "data", 4);
    wavHeader.subchunk2Size = arrayLength * sizeof(float);

    // 写入 WAV 文件头
    [outputStream write:(const uint8_t *)&wavHeader maxLength:sizeof(wavHeader)];

    // 将 float 数组的内容写入文件
    [outputStream write:(const uint8_t *)floatArray maxLength:arrayLength * sizeof(float)];

    // 关闭文件写入器
    [outputStream close];