Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
caus148
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
#1

Воспроизведение аудио из памяти используя AVAydioPlayer - Objective-C

29.05.2015, 01:27. Просмотров 733. Ответов 4
Метки нет (Все метки)

Здравствуйте. Моя задача состоит в проигрывании аудио из микрофона в режиме реального времени.
Я сначала создаю сессию, следующим образом
http://www.cyberforum.ru/objective-c/thread355912.html
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:NULL];
    //[audioSession setMode:AVAudioSessionModeMeasurement error:NULL];
    [audioSession setActive:YES error:NULL];
    
    // Optional - default gives 1024 samples at 44.1kHz
    //[session setPreferredIOBufferDuration:samplesPerSlice/session.sampleRate error:NULL];
    
    // Configure the capture session (strongly-referenced instance variable, otherwise the capture stops after one slice)
    _captureSession = [[AVCaptureSession alloc] init];
    
    // Configure audio device input
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];
    [_captureSession addInput:input];
    
    // Configure audio data output
    AVCaptureAudioDataOutput *output = [[AVCaptureAudioDataOutput alloc] init];
    dispatch_queue_t queue = dispatch_queue_create("My callback", DISPATCH_QUEUE_SERIAL);
    [output setSampleBufferDelegate:self queue:queue];
    [_captureSession addOutput:output];
    
    // Start the capture session.   
    [_captureSession startRunning];
После того, как я перехватываю аудио сигналы, пытаюсь воспроизвести их через AVAudioPlayer, но постоянно получаю значение плеера nil

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
AudioBufferList audioBufferList;
        NSMutableData *data= [NSMutableData data];
        CMBlockBufferRef blockBuffer;
        CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
 
        for( int y=0; y< audioBufferList.mNumberBuffers; y++ ){
 
            AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
            Float32 *frame = (Float32*)audioBuffer.mData;
 
            [data appendBytes:frame length:audioBuffer.mDataByteSize];
 
        }
 
        CFRelease(blockBuffer);
        NSError *err;
        AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error:&err];
        NSLog(@"%@", err);
        [player play];
}
Как мне воспроизвести полученные сигналы из памяти, не прибегая к записи в файл?. Спасибо!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2015, 01:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Воспроизведение аудио из памяти используя AVAydioPlayer (Objective-C):

Воспроизведение аудио
Доброго времени суток! Посоветуйте инструмент для воспроизведения аудио...

Воспроизведение аудио
Всем доброго времени суток. Написал небольшую программу для воспроизведения...

Воспроизведение аудио
Здравствуйте! Есть вот такая простая конструкция, работает нормально. Аудио...

Воспроизведение аудио
Нужно, чтобы аудио-дорожка воспроизводилась без остановки до определенного...

Непрерывное воспроизведение аудио
Здравствуйте! Я хочу сделать так, чтобы аудио воспроизводилось непрерывно, но у...

4
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
29.05.2015, 08:07 #2
Лучший ответ Сообщение было отмечено caus148 как решение

Решение

C AVAudioPlayer не получится, но это довольно просто сделать с помощью AudioUnits. Для примера можете посмотреть
https://developer.apple.com/library/...id/DTS40007770
https://developer.apple.com/library/...id/DTS40009555
Вкратце: то, что приходит с микрофона пишете в циклический буфер. В render callback'e аудиоюнита забираете данные из буфера
0
caus148
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
29.05.2015, 16:12  [ТС] #3
Посмотрел пример. Спасибо.
Как мне воспроизвести аудио из ioData? Находимся в render callback'e

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
static OSStatus performRender (void                         *inRefCon,
                               AudioUnitRenderActionFlags   *ioActionFlags,
                               const AudioTimeStamp         *inTimeStamp,
                               UInt32                       inBusNumber,
                               UInt32                       inNumberFrames,
                               AudioBufferList              *ioData)
{
    OSStatus err = noErr;
    if (*cd.audioChainIsBeingReconstructed == NO)
    {
        // we are calling AudioUnitRender on the input bus of AURemoteIO
        // this will store the audio data captured by the microphone in ioData
        err = AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
        
        // filter out the DC component of the signal
        cd.dcRejectionFilter->ProcessInplace((Float32*) ioData->mBuffers[0].mData, inNumberFrames);
        
        // based on the current display mode, copy the required data to the buffer manager
        if (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeWaveform)
        {
            cd.bufferManager->CopyAudioDataToDrawBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames);
        }
        
        else if ((cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeSpectrum) || (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeFFT))
        {
            if (cd.bufferManager->NeedsNewFFTData())
                cd.bufferManager->CopyAudioDataToFFTInputBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames);
        }
        
        // mute audio if needed
        if (*cd.muteAudio)
        {
            for (UInt32 i=0; i<ioData->mNumberBuffers; ++i)
                memset(ioData->mBuffers[i].mData, 0, ioData->mBuffers[i].mDataByteSize);
        }
    }
    
    return err;
}
Добавлено через 31 минуту
glvrzzz, Слышу голос только не через динамики. Буду дальше с библиотекой разбираться
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
29.05.2015, 17:08 #4
Цитата Сообщение от caus148 Посмотреть сообщение
glvrzzz, Слышу голос только не через динамики. Буду дальше с библиотекой разбираться
Вот чем-то мне эта фраза кажется странной, что-ли...
Понять бы еще чем
0
caus148
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
29.05.2015, 17:11  [ТС] #5
zulkis, имется ввиду, что у телефона есть динамики, через которую слушают музыку без наушников и собственно динамик, через который слышим голос другого абонента, когда разговариваем по телефону. Так вот мне надо слышать голос через динамик, который проигрывает музыку)
0
29.05.2015, 17:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 17:11
Привет! Вот еще темы с решениями:

Воспроизведение потокового аудио
Тема не раз затрагивалась, но нигде не нашел ответа на свой вопрос. в общем...

Воспроизведение аудио с PHP
Здравствуйте! Подскажите, как можно воспроизвести аудиофайл при помощи php?

Воспроизведение аудио файла
Здравствуйте, я только начал программировать на java, но у меня уже имеется...

Потоковое воспроизведение аудио
Привет, как можно реализовать потоковое воспроизведение аудио с элементами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru