2015-01-20 3 views
1

Так я использовал AVAssetReader получил CMSampleBufferRef, а затем я получил образцы значений от CMBlockBufferRef данных.Как я могу написать в AVAssetWriter свой собственный массив float/shorts?

Затем я сменил эти образцы с помощью специального фильтра.

Теперь у меня есть набор шорт, который я хочу записать обратно в файл, используя AVAssetWriter.

Мой вопрос здесь, как мне создать обратно CMSampleBufferRef и CMBlockBufferRef для отправки на AVAssetWriter?

ответ

0

Посмотрите на это apple developer page.

EDIT: на основе ваших комментариев, чтобы создать samplebuffer непосредственно из массива шорты, вы должны использовать ядро ​​Media Framework компоненты, т.е. CMSampleBufferCreate

  1. Преобразование выборки данных в шортах массиве AudioBufferList
  2. Преобразование AudioBufferList в CMSampleBuffer.

Например:

OSStatus status = noErr; 
CMItemCount framesToProcess = 8192; 
unsigned long sizeInBytes = framesToProcess * sizeof(SInt16); 

// Init ABL from sample array 
AudioBufferList *myAudioBufferList; // contains converted 
myAudioBufferList = static_cast<AudioBufferList *>(calloc(1, offsetof(AudioBufferList, mBuffers) + (sizeof(AudioBuffer)))); 
myAudioBufferList->mNumberBuffers = 1; 
myAudioBufferList->mBuffers[0].mNumberChannels = 1; 
myAudioBufferList->mBuffers[0].mData = JoãoSamplesArrayPointer; 
myAudioBufferList->mBuffers[0].mDataByteSize = (UInt32)sizeInBytes; 

// sampleBuffer in (from the assetreader) you already have this 
CMSampleBufferRef sampleBufferIn = [self.assetReaderAudioOutput copyNextSampleBuffer]; 

CMAudioFormatDescriptionRef format = CMSampleBufferGetFormatDescription(sampleBufferIn); 
const AudioStreamBasicDescription *assetReaderOutputASBD = CMAudioFormatDescriptionGetStreamBasicDescription(format); 

// setup output samplebuffer 
CMSampleBufferRef sampleBufferOut = NULL; 
CMSampleTimingInfo timing = { CMTimeMake(1, sampleRate), kCMTimeZero, kCMTimeInvalid }; 

// create description 
status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, assetReaderOutputASBD, 0, NULL, 0, NULL, NULL, &format); 

// create buffer 
CMSampleBufferCreate(kCFAllocatorDefault, NULL, false, NULL, NULL, format, framesToProcess, 1, &timing, 0, NULL, &sampleBufferOut); 

// put data into buffer from ABL (audio buffer list) 
status = CMSampleBufferSetDataBufferFromAudioBufferList(sampleBufferOut, kCFAllocatorDefault, kCFAllocatorDefault, 0, myAudioBufferList); 

// write to assetwriter audioinput 
BOOL success = [self.assetWriterAudioInput appendSampleBuffer:sampleBufferOut]; 
CFRelease(sampleBufferOut); 
+0

Я понимаю, этот код. Но это не то, что я прошу –

+0

Что вы спрашиваете более конкретно? Я попытался решить проблему создания CMSampleBufferRef, как показано в коде. –

+0

Мне нужно создать буфер образца из моего массива shorts, а не из считывателя свойств –