Чтение аудио сэмплов через AVAssetReader

Как вы читаете аудио-образцы через AVAssetReader? Я нашел примеры дублирования или микширования с использованием AVAssetReader, но эти петли всегда управляются контуром AVAssetWriter. Можно ли просто создать AVAssetReader и прочитать его, получить каждый образец и выбросить int32 каждого аудио-образца в массив?

Благодарю.

Чтобы расширить ответ на @ amrox, вы можете получить AudioBufferList из CMBlockBufferRef, например

CMItemCount numSamplesInBuffer = CMSampleBufferGetNumSamples(buffer); AudioBufferList audioBufferList; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer( buffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &buffer ); for (int bufferCount=0; bufferCount < audioBufferList.mNumberBuffers; bufferCount++) { SInt16* samples = (SInt16 *)audioBufferList.mBuffers[bufferCount].mData; for (int i=0; i < numSamplesInBuffer; i++) { // amplitude for the sample is samples[i], assuming you have linear pcm to start with } } //Release the buffer when done with the samples //(retained by CMSampleBufferGetAudioBufferListWithRetainedblockBuffer) CFRelease(buffer); 
 AVAssetReader *reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; NSDictionary *settings = @{ AVFormatIDKey : [NSNumber numberWithInt:kAudioFormatLinearPCM] }; AVAssetReaderTrackOutput *readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:track outputSettings:settings]; [reader addOutput:readerOutput]; [reader startReading]; CMSampleBufferRef sample = [readerOutput copyNextSampleBuffer]; while ( sample ) { sample = [readerOutput copyNextSampleBuffer]; if ( ! sample ) { continue; } CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sample); size_t lengthAtOffset; size_t totalLength; char *data; if ( CMBlockBufferGetDataPointer( buffer, 0, &lengthAtOffset, &totalLength, &data ) != noErr ) { NSLog(@"error!"); break; } // do something with data... CFRelease(sample); } 

Ответы здесь не общие. Вызов CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer может завершиться неудачно, если AudioBufferList должен быть разным. При использовании в качестве примера неперечисленных образцов.

Правильный способ – дважды вызвать CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer . Первый вызов запрашивает размер, необходимый для AudioBufferList а второй фактически заполняет AudioBufferList .

 size_t bufferSize = 0; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer( sampleBuffer, &bufferSize, NULL, 0, NULL, NULL, 0, NULL ); AudioBufferList *bufferList = malloc(bufferSize); CMBlockBufferRef blockBuffer = NULL; CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer( sampleBuffer, NULL, bufferList, bufferSize, NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer ); // handle audio here free(bufferList); CFRelease(blockBuffer); 

В реальном мире вы должны выполнить обработку ошибок, а также не должны malloc каждый кадр, а затем кэшировать AudioBufferList .

  • установить фоновое изображение для всего приложения iPhone / iPad
  • NSDateFormatter с 24 часами
  • Преобразование NSString даты в NSDate
  • Получить значение RGB из пресетов UIColor
  • UITableView, прокрутите вниз до перезагрузки?
  • Возвратитесь к поведению приложения после разговора по телефону в собственном коде, чем UIWebView
  • Переменные экземпляра для объектов Objective C
  • UITextField: перемещение вида при появлении клавиатуры
  • Стилизация кнопки отмены в UISearchBar
  • Как -performSelector: withObject: afterDelay: работать?
  • Объектив-C Категория Причинение непризнанного селектора
  • Interesting Posts

    Как получить путь сборки, в которой находится код?

    Объявлять экземпляр типового типа динамически

    Как удалить приложения для Windows в Windows 10?

    Как использовать конструкторы базового classа и оператор присваивания в C ++?

    Форматирование Word – необходимо выравнивать слева направо, справа налево в одной строке

    .htaccess Удалить WWW из URL + Каталогов

    Непоследовательность Доступность: тип параметра менее доступен, чем метод

    Как преобразовать строку в double с правильной культуройinfo

    Запуск эмулятора Android быстрее

    Как запретить Firefox преобразовывать URL-адреса localhost / * в поисковые запросы?

    Каков самый простой способ подключения двух компьютеров?

    Почему отлаженная программа так сильно замедляется при использовании отладки ввода метода?

    Упорядочить базовые графики и таблицы grid.tables на одной странице

    Как идентифицировать дистрибутив linux?

    Оценка короткого замыкания и побочные эффекты

    Давайте будем гением компьютера.