Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
caus148
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
29.05.2015, 01:27     Воспроизведение аудио из памяти используя AVAydioPlayer #1
Здравствуйте. Моя задача состоит в проигрывании аудио из микрофона в режиме реального времени.
Я сначала создаю сессию, следующим образом
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];
}
Как мне воспроизвести полученные сигналы из памяти, не прибегая к записи в файл?. Спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2015, 01:27     Воспроизведение аудио из памяти используя AVAydioPlayer
Посмотрите здесь:

Воспроизведение аудио C#
Воспроизведение аудио C#
Objective-C Воспроизведение аудио потока
Освобождение памяти Objective-C
Android Воспроизведение аудио
Воспроизведение аудио Java SE
Воспроизведение музыки из интернета сразу после нажатия кнопки Objective-C
Приложение вылетает, сообщая о нехватке памяти Objective-C
Objective-C Сколько максимум оперативной памяти желательно использовать приложению?
Получить объект по адресу в памяти Objective-C
Objective-C HTMLParser - ошибка памяти
Objective-C Останавливается воспроизведение

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
29.05.2015, 08:07     Воспроизведение аудио из памяти используя AVAydioPlayer #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C AVAudioPlayer не получится, но это довольно просто сделать с помощью AudioUnits. Для примера можете посмотреть
https://developer.apple.com/library/...id/DTS40007770
https://developer.apple.com/library/...id/DTS40009555
Вкратце: то, что приходит с микрофона пишете в циклический буфер. В render callback'e аудиоюнита забираете данные из буфера
caus148
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
29.05.2015, 16:12  [ТС]     Воспроизведение аудио из памяти используя AVAydioPlayer #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, Слышу голос только не через динамики. Буду дальше с библиотекой разбираться
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
29.05.2015, 17:08     Воспроизведение аудио из памяти используя AVAydioPlayer #4
Цитата Сообщение от caus148 Посмотреть сообщение
glvrzzz, Слышу голос только не через динамики. Буду дальше с библиотекой разбираться
Вот чем-то мне эта фраза кажется странной, что-ли...
Понять бы еще чем
caus148
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
29.05.2015, 17:11  [ТС]     Воспроизведение аудио из памяти используя AVAydioPlayer #5
zulkis, имется ввиду, что у телефона есть динамики, через которую слушают музыку без наушников и собственно динамик, через который слышим голос другого абонента, когда разговариваем по телефону. Так вот мне надо слышать голос через динамик, который проигрывает музыку)
Yandex
Объявления
29.05.2015, 17:11     Воспроизведение аудио из памяти используя AVAydioPlayer
Ответ Создать тему
Опции темы

Текущее время: 12:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru