添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
登录

使用扩展音频文件写入和读取音频文件

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2015-09-22
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2015-09-21 16:19

我正在使用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;