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

Objective-C

Войти
Регистрация
Восстановить пароль
 
caus148
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 5
#1

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

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

Здравствуйте. Моя задача состоит в проигрывании аудио из микрофона в режиме реального времени.
Я сначала создаю сессию, следующим образом
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):

Воспроизведение аудио потока - Objective-C
Для воспроизведения потока использую AVPlayer с аргументов NSURL. Подскажите, как заставить плеер работать через прокси сервер?

Воспроизведение аудио - Программирование Android
Здравствуйте! Есть вот такая простая конструкция, работает нормально. Аудио воспроизводится по нажатию на кнопку. Но есть одно &quot;но&quot; -...

Воспроизведение аудио - C#
Доброго времени суток! Посоветуйте инструмент для воспроизведения аудио (небольшой аудиоплеер, пишу для себя) в C#. Желательно чтобы...

Воспроизведение аудио - Java SE
Нужно, чтобы аудио-дорожка воспроизводилась без остановки до определенного события (нажатие кнопки, например). try { File...

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

Потоковое воспроизведение аудио - Delphi
Привет, как можно реализовать потоковое воспроизведение аудио с элементами управления ? (Перемотка, пауза и тд...)

4
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
29.05.2015, 08:07 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
682 / 609 / 38
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 17:11
Привет! Вот еще темы с ответами:

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

Воспроизведение потокового аудио - Программирование Android
Я в девелопинге по андроид новичек. Хотел бы уточнить кое какие мысли... Есть сайт с потоковым аудио ...

Непрерывное воспроизведение аудио - Matlab
Здравствуйте! Я хочу сделать так, чтобы аудио воспроизводилось непрерывно, но у меня не всё получается, поэтому хочу тут спросить. У меня...

Остановка / воспроизведение аудио - Программирование Android
выручайте) в общем, есть всего одна кнопка, которая останавливает и воспроизводит изначально запущенное аудио. почему она только...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
29.05.2015, 17:11
Ответ Создать тему
Опции темы

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