AVCaptureSession и AudioQueue - PullRequest
       47

AVCaptureSession и AudioQueue

2 голосов
/ 29 февраля 2012

Я новичок в Objective-C и iOS, и мне нужна ваша помощь.Я хотел бы взять аудиовход с микрофона и перенаправить его прямо на выход динамика (без прохождения файла).

Я здесь: использую AVCaptureSession, чтобы получить мой микрофонный вход, и AudioQueue, чтобы попытаться воспроизвести выходной буфер.Но я ничего не могу найти в интернете, похоже, это никому не нужно.Я что-то неправильно понимаю? Я просто хочу знать, как преобразовать мой CMsampleBufferRef в хороший pcmbuffer, который мой AudioQueue может использовать для воспроизведения (и так, что изменить в моем AudioQueue, чтобы связать его с моим AVCaptureSession) .Это хороший способ сделать?Я нашел много вещей, чтобы записать выходной буфер в файл, но для того, чтобы что-то делать на лету, ничего, или только короткие объяснения, которые я пока не могу использовать.

Пожалуйста, не могли бы вы дать мне оченьподробные объяснения с примером кода, потому что я новичок.Пока я могу заставить работать мой AVCaptureSession (что-то есть в CMSampleBufferRef), я могу воспроизвести файл с помощью AudioQueue, но когда я хочу связать эти два, я не могу понять, как это сделать.

Заранее спасибо

1 Ответ

0 голосов
/ 12 марта 2013

См. Код ниже, который я написал (используя ссылки, которые я нашел в Интернете).Я не проверил это полностью.

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    AudioBufferList bufList;
    CMBlockBufferRef blockBuffer;
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &bufList, sizeof(bufList), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer);


    NSMutableData *currentSample = nil;
    for(int i = 0; i < bufList.mNumberBuffers; i++)
    {
        if(i == 0)
        {
            currentSample = [NSMutableData dataWithBytes:bufList.mBuffers[i].mData length:bufList.mBuffers[i].mDataByteSize];
        }else
        {
            [currentSample appendBytes:bufList.mBuffers[i].mData length:bufList.mBuffers[i].mDataByteSize];
        }
    }
}
...