我尝试在原始PCM数据上添加一个wav头,使其可以通过AVAudioPlayer播放。但是我找不到任何解决方案或源代码,在iOS上使用Objective-C/Swift。虽然我找到了this,但它没有正确的答案。
但是我发现了一段代码here,这是在C中,也包含一些问题。wav文件不能正常播放,这是从该代码生成的。
我已经给了我的代码下面,我已经编码到目前为止。
int NumChannels = AUDIO_CHANNELS_PER_FRAME;
short BitsPerSample = AUDIO_BITS_PER_CHANNEL;
int SamplingRate = AUDIO_SAMPLE_RATE;
int numOfSamples = [[NSData dataWithContentsOfFile:filePath] length];
int ByteRate = NumChannels*BitsPerSample*SamplingRate/8;
short BlockAlign = NumChannels*BitsPerSample/8;
int DataSize = NumChannels*numOfSamples*BitsPerSample/8;
int chunkSize = 16;
int totalSize = 36 + DataSize;
short audioFormat = 1;
if((fout = fopen([wavFilePath cStringUsingEncoding:1], "w")) == NULL)
{
printf("Error opening out file ");
}
fwrite("RIFF", sizeof(char), 4,fout);
fwrite(&totalSize, sizeof(int), 1, fout);
fwrite("WAVE", sizeof(char), 4, fout);
fwrite("fmt ", sizeof(char), 3, 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), 3, fout);
fwrite(&DataSize, sizeof(int), 1, fout);
文件播放太快,声音失真,只有前10至20(左右)秒播放。我认为,wav头没有正确生成(因为我能够使用AudioUnit/AudioQueue播放相同的PCM数据/缓冲区)。所以我在我的代码中遗漏了什么?任何帮助将不胜感激。
先谢了。
4条答案
按热度按时间zc0qhyus1#
好吧,如果这对别人有帮助,我就回答我自己的问题。经过几天不知疲倦的尝试,下面是一个用Objective-C和C编写的完整函数。它以一个文件路径作为参数,其中包含直接从麦克风捕获的原始PCM数据,并返回一个文件路径,其中包含PCM数据,然后是适当的wav头信息。然后你就可以用AVAudioPlayer或者AVPlayer播放那个文件了。下面是代码...
但该功能仅适用于以下音频设置。
tv6aics12#
非常有帮助的问答,非常感谢。
此快捷版本适用于有需要的人士:
thtygnil3#
修改自qiz对swift 5的回答
cczfrluj4#
这是Swift的一个数据扩展,它返回另一个数据,使用the answer from qiz生成。