Невозможно воспроизвести звук с помощью AVAudioPlayer Mac OS - PullRequest
0 голосов
/ 12 марта 2019

Я новичок в разработке для 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.)

Может кто-нибудь выяснить проблему здесь и помочь мне решить ее.

...