Я новичок в разработке для Mac, так что извините, если этот вопрос уже где-то задавался.Я не смог найти никакого решения, поэтому я публикую свою проблему здесь.
По сути, я пытаюсь захватить звук микрофона с помощью AVCaptureSession
и воспроизвести звук с помощью AVAudioPlayer.
Ниже приведен код для начала сеанса захвата,
-(void)setupCaptureSession {
AVCaptureSession* captureSession = [AVCaptureSession new];
AVCaptureDevice* audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
NSError* error;
AVCaptureDeviceInput* audioInput = [[AVCaptureDeviceInput alloc] initWithDevice:audioCaptureDevice error:&error];
if (error) {
NSLog(@"AVCaptureDeviceInput Error: %@", error.localizedDescription);
}
if ([captureSession canAddInput:audioInput]) {
[captureSession addInput:audioInput];
} else {
NSLog(@"Unable to add Audio Input to Capture Session");
}
AVCaptureAudioDataOutput* audioOutput = [AVCaptureAudioDataOutput new];
NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey, [NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: 64000], AVEncoderBitRateKey, nil];
audioOutput.audioSettings = settings;
dispatch_queue_t audioQueue = dispatch_queue_create("AudioSessionQueue", nil);
[audioOutput setSampleBufferDelegate:self queue:audioQueue];
if ([captureSession canAddOutput:audioOutput]) {
[captureSession addOutput:audioOutput];
} else {
NSLog(@"Unable to add Audio Output to Capture Session");
}
[captureSession commitConfiguration];
[captureSession startRunning];
currentSession = captureSession;
}
Код для обработки записи аудиоданных,
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
AudioBufferList audioBufferList;
CMBlockBufferRef blockBuffer;
NSMutableData *data=[[NSMutableData alloc] init];
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, nil, &audioBufferList, sizeof(audioBufferList), nil, nil, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer);
for( int i=0; i < audioBufferList.mNumberBuffers; i++ )
{
AudioBuffer audioBuffer = audioBufferList.mBuffers[i];
Float32 *frame = (Float32*)audioBuffer.mData;
[data appendBytes:frame length:audioBuffer.mDataByteSize];
}
if (audioData == nil) {
audioData = [NSMutableData new];
}
[audioData appendData:data];
CFRelease(blockBuffer);
blockBuffer=NULL;
}
Код для воспроизведения аудиоданных,
if ([audioData length] > 0) {
NSError* error;
AVAudioPlayer* player = [[AVAudioPlayer alloc] initWithData:audioData error:&error];
if (error) {
NSLog(@"Unable to create AVAudioPlayer: %@", error.localizedDescription);
} else {
[player play];
}
}
Моя проблема в том, что когда я создаю AVAudioPlayer с захваченными данными, я получаю следующую ошибку:
Unable to create AVAudioPlayer: The operation couldn’t be completed. (OSStatus error 1954115647.)
Может кто-нибудь выяснить проблему здесь и помочь мне решить ее.