gpt4 book ai didi

ios - RemoteIO 录制的音频文件为静音或 4KB

转载 作者:行者123 更新时间:2023-12-01 19:15:41 31 4
gpt4 key购买 nike

我正在成功使用 RemoteIO 对来自麦克风的传入音频流进行分析。不过,我似乎无法将文件写入磁盘。我已经阅读了一些问题:

  • Example of saving audio from RemoteIO? ,
  • AudioBufferList contents in remoteIO audio unit playback callback ,
  • Recording to AAC from RemoteIO: data is getting written but file unplayable
  • Recording from RemoteIO: resulting .caf is pitch shifted slower + distorted

  • 并试图在那里实现这些建议:除非它们不起作用。调用 ExtAudioFileWriteAsync 的正确位置在哪里,如何设置?

    最佳答案

    除了 RemoteIO 本身的(相当艰巨但更好地由 Apple's example code 覆盖)设置过程之外,洞察的关键点是:

  • 使用相同的AudioStreamBasicDescription ( *audioFormat ) 我一开始用来设置流。根据其他问题和帖子,我不知道我花了多长时间尝试设置一个参数略有不同的新参数。只需从我的 ivar 中引用流属性就足够了。
  • 设置一个“isRecording” bool 值,这样您就可以打开和关闭写入文件,而无需拆除和重新设置您的 RemoteIO session
  • 可以写入 recordingCallback 中的文件,嗯,回调,但异步执行。很多信息都在谈论在playbackCallback 中执行此操作或设置第三个audioFileWriteCallback。这导致了无声文件或 4KB(即空)文件。不要这样做。
  • 此外,请务必使用传入回调
  • 的 ioData 的副本。

    recordingCallbackAudioUnitRender 之后进入 bufferList :
        AudioDeviceManager* THIS = (__bridge AudioDeviceManager *)inRefCon;
    if (THIS->isRecording) {
    ExtAudioFileWriteAsync(THIS->extAudioFileRef, inNumberFrames, bufferList);
    }
  • 开始和停止录音功能,供引用:

  • -(void)startRecording {


      NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *destinationFilePath = [documentsDirectory stringByAppendingPathComponent:kAudioFileName];
    CFURLRef destinationURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)destinationFilePath, kCFURLPOSIXPathStyle, false);

    OSStatus status;

    // create the capture file
    status = ExtAudioFileCreateWithURL(destinationURL, kAudioFileWAVEType, &audioFormat, NULL, kAudioFileFlags_EraseFile, &extAudioFileRef);
    if (status) NSLog(@"Error creating file with URL: %ld", status);

    // use the same "audioFormat" AudioStreamBasicDescription we used to set up RemoteIO in the first place
    status = ExtAudioFileSetProperty(extAudioFileRef, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &audioFormat);

    ExtAudioFileSeek(extAudioFileRef, 0);
    ExtAudioFileWrite(extAudioFileRef, 0, NULL);

    isRecording = YES;
    }
    - (void)stopRecording {

    isRecording = NO;
    OSStatus status = ExtAudioFileDispose(extAudioFileRef);
    if (status) printf("ExtAudioFileDispose %ld \n", status);
    }

    就是这样!

    关于ios - RemoteIO 录制的音频文件为静音或 4KB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501815/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com