gpt4 book ai didi

ios - AVAudioRecorder 写入文件的速度不够快

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:06 24 4
gpt4 key购买 nike

我正在使用以下代码通过 AVAudioRecorder 进行录音。我也正在实时访问录制的音频(4 秒后)。但是,数据在 6 秒之前为 NULL。

有没有办法强制要求记录器写入文件?

NSDictionary * recordSetting;
recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:11025] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];

self.fileURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recorded.aac", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]];
self.recorder = [[AVAudioRecorder alloc] initWithURL:self.fileURL settings:recordSetting error:nil];
self.recorder.meteringEnabled = YES;
self.recorder.delegate = self;
[self.recorder record];

4 秒后,我尝试使用 NSDate 读取文件。

NSData *songData = [NSData dataWithContentsOfURL:self.recorder.url];

但是 songData 直到 6 秒后才为 nil。

我知道使用 AudioQueue 可以做到这一点,但是,我不想进入 AudioQueue,因为我想这太过分了。

谢谢。

最佳答案

免责声明:正确的方法是记录您的输入音频(通过 AudioUnit/AVAudioEngine/AudioQueue)并对其进行编码使用 AudioConverter,尽管在​​ iOS 上录制是推送的,而 AudioConverter 是拉的,这并不利于很好的 SO 阅读。如您所见,依靠高级 API(如 AVAudioRecorder)在您翻找它时及时将其输出写入其文件并不是很可靠。以下代码示例 (AVAudioEngine + ExtendedAudioFile) 应该在约 1 秒后获取音频数据。

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/ExtendedAudioFile.h>
// ...
@property (nonatomic) AVAudioEngine *engine;
// ...

NSURL *fileURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recorded.aac", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]];


const Float64 sampleRate = 11025;

AudioStreamBasicDescription aacDesc = { 0 };
aacDesc.mSampleRate = sampleRate;
aacDesc.mFormatID = kAudioFormatMPEG4AAC;
aacDesc.mFramesPerPacket = 1024;
aacDesc.mChannelsPerFrame = 1;

ExtAudioFileRef eaf;
OSStatus err = ExtAudioFileCreateWithURL((__bridge CFURLRef)fileURL, kAudioFileAAC_ADTSType, &aacDesc, NULL, kAudioFileFlags_EraseFile, &eaf);
assert(noErr == err);


self.engine = [[AVAudioEngine alloc] init];

AVAudioInputNode *input = self.engine.inputNode;
const AVAudioNodeBus bus = 0;

AVAudioFormat *micFormat = [input inputFormatForBus:bus];

err = ExtAudioFileSetProperty(eaf, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), micFormat.streamDescription);
assert(noErr == err);

[input installTapOnBus:bus bufferSize:512 format:micFormat block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {
const AudioBufferList *abl = buffer.audioBufferList;
OSStatus err = ExtAudioFileWrite(eaf, buffer.frameLength, abl);
assert(noErr == err);
}];

NSError *error;
if (![self.engine startAndReturnError:&error]) {
NSLog(@"Engine start: %@", error);
}

关于ios - AVAudioRecorder 写入文件的速度不够快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34391260/

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