iOS PCM音頻數據轉wav

// 將pcm存為wav文件
- (NSString *) getAndCreatePlayableFileFromPcmData{
    NSArray *arrDocumentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *documentPath = [arrDocumentPaths objectAtIndex:0];
    NSString *dirFilePath = [documentPath stringByAppendingPathComponent:@"audio"];
    // 注意這里必須要有這個文件夾,下面存儲音頻時才不會報錯
    if (![[NSFileManager defaultManager] fileExistsAtPath:dirFilePath]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:dirFilePath withIntermediateDirectories:YES attributes:nil
                                                        error:NULL];
    }
    NSDate *date = [NSDate date];
    NSString *fileName = [NSString stringWithFormat:@"iOS_%@.wav",[self.dateFormatter stringFromDate:date]];
    NSString *wavFilePath = [dirFilePath stringByAppendingPathComponent:fileName];
    
    short NumChannels = 1;       //錄音通道數
    short BitsPerSample = 16;    //線性采樣位數
    int SamplingRate = 16000;     //錄音采樣率(Hz)
    int numOfSamples = (int)self.recordedData.length;
    
    int ByteRate = NumChannels*BitsPerSample*SamplingRate/8;
    short BlockAlign = NumChannels*BitsPerSample/8;
    int DataSize = NumChannels*numOfSamples*BitsPerSample/8;
    int chunkSize = 16;
    int totalSize = 46 + DataSize;
    short audioFormat = 1;
    
    const char *wavFilePathChar = [wavFilePath cStringUsingEncoding:NSUTF8StringEncoding];
    @synchronized (self) {
        FILE *fout = fopen(wavFilePathChar, "w");
        if(fout == NULL){
            return nil;
        }
        
        fwrite("RIFF", sizeof(char), 4,fout);
        fwrite(&totalSize, sizeof(int), 1, fout);
        fwrite("WAVE", sizeof(char), 4, fout);
        fwrite("fmt ", sizeof(char), 4, fout);
        fwrite(&chunkSize, sizeof(int),1,fout);
        fwrite(&audioFormat, sizeof(short), 1, fout);
        fwrite(&NumChannels, sizeof(short),1,fout);
        fwrite(&SamplingRate, sizeof(int), 1, fout);
        fwrite(&ByteRate, sizeof(int), 1, fout);
        fwrite(&BlockAlign, sizeof(short), 1, fout);
        fwrite(&BitsPerSample, sizeof(short), 1, fout);
        fwrite("data", sizeof(char), 4, fout);
        fwrite(&DataSize, sizeof(int), 1, fout);
        
        fclose(fout);
        NSFileHandle *handle;
        handle = [NSFileHandle fileHandleForUpdatingAtPath:wavFilePath];
        [handle seekToEndOfFile];
       // self.recordedData 為需要保存的pcm數據
        [handle writeData:self.recordedData];
        [handle closeFile];
        return wavFilePath;
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容