我正在使用ExtAudioFileWriteAsync写一个音频文件,同时使用设备录制,但一旦我完成录制,我尝试用ExtAudioFileRead函数读取它,我得到的样本与我正在编写的样本不同……有人知道为什么会发生这种事吗?
对于写作:
self.audioManager.inputBlock = ^(float *data, UInt32 numFrames, UInt32 numChannels) {
for (int i = 0; i < numFrames*numChannels; i++) {
printf("write*%f\n", data[i]);
}
UInt32 numIncomingBytes = numFrames*numChannels*sizeof(float);
UInt32 *outputBuffer =(UInt32*)malloc(numIncomingBytes);
memcpy(outputBuffer, recordedData, numIncomingBytes);
AudioBufferList outgoingAudio;
outgoingAudio.mNumberBuffers = 1;
outgoingAudio.mBuffers[0].mNumberChannels = numChannels;
outgoingAudio.mBuffers[0].mDataByteSize = numIncomingBytes;
outgoingAudio.mBuffers[0].mData = self.outputBuffer;
if( 0 == pthread_mutex_trylock( &outputAudioFileLock ) )
{
ExtAudioFileWriteAsync(outputFile, numFrames, &outgoingAudio);
}
pthread_mutex_unlock( &outputAudioFileLock );
};
[self.audioManager play];
阅读:
UInt32 *outputBuffer = (UInt32 *)malloc(numFrames*numChannels*sizeof(float));
AudioBufferList convertedData;
convertedData.mNumberBuffers = 1;
convertedData.mBuffers[0].mNumberChannels = numChannels;
convertedData.mBuffers[0].mDataByteSize = numFrames*numChannels*sizeof(float);
convertedData.mBuffers[0].mData = outputBuffer;
NSMutableArray *samplesArray = [[NSMutableArray alloc]init];
while (numFrames > 0) {
ExtAudioFileRead(inputFile, &numFrames, &convertedData);
if (numFrames > 0) {
AudioBuffer audioBuffer = convertedData.mBuffers[0];
float *samples = (float *)audioBuffer.mData;
for (int i = 0; i < frameCount*numChannels; i++) {
printf("read*%f\n", samples[i]);
}
}
}
顺便说一下,我使用Novocaine项目来获取设备音频。我可以用Novocaine代码或任何其他播放器重现保存的音频。
在写入ExtAudioFileRef输出时:
ExtAudioFileCreateWithURL(audioFileRef, kAudioFileM4AType, &outputFileDesc, NULL, kAudioFileFlags_EraseFile, &outputFile);
outputFileDesc在哪里
AudioStreamBasicDescription outputFileDesc = {44100.0,kAudioFormatMPEG4AAC,0,0,1024,0,thisNumChannels,0,0};outputFileDesc.mFormatFlags = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
读取ExtAudioFileRef inputFile时:
ExtAudioFileOpenURL(audioFileRef, &inputFile):
在这两种情况下(写入和读取),它应用相同的格式:
AudioStreamBasicDescription outputFormat;
_outputFormat.mSampleRate = self.samplingRate;
_outputFormat.mFormatID = kAudioFormatLinearPCM;
_outputFormat.mFormatFlags = kAudioFormatFlagIsFloat;
_outputFormat.mBytesPerPacket = 4*self.numChannels;
_outputFormat.mFramesPerPacket = 1;
_outputFormat.mBytesPerFrame = 4*self.numChannels;
_outputFormat.mChannelsPerFrame = self.numChannels;
_outputFormat.mBitsPerChannel = 32;
ExtAudioFileSetProperty(outputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &_outputFormat);
ExtAudioFileSetProperty(inputFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &_outputFormat);
顺便说一句,即使读取的样本与写入的样本不相等,两个信号的平均值也非常相似。但是我不能完全理解为什么不是完全平等!
知道我做错了什么吗?
发布于 2015-09-22 00:18:15
这听起来像是从一个或两个ExtaudioFileRefs进行了隐式格式转换,而您看到的是不同的转换结果。您有三种格式: audio_in_format、file_format和audio_out_format。如果audio_in_format与file_format不同,写入ExtAudioFileRef会创建一个音频转换器,以便您在写入磁盘之前将输入音频转换为file_format。如果file_format不同于audio_out_format,那么读取ExtAudioFileRef也会创建一个转换器。
观点:你将你的写作ExtAudioFileRef命名为"outputFile",而你的阅读ExtAudioFileRef命名为"inputFile“,这是令人困惑的。我会使用像audioWriter和audioReader这样的东西。
https://stackoverflow.com/questions/32690423
复制相似问题