Как я могу получить образцы из CMSampleBufferRef для сдвига высоты тона? - PullRequest
0 голосов
/ 25 июля 2011

Я пытаюсь получить сэмплы из CMSampleBufferRef и в массив с плавающей точкой, чтобы изменить высоту тона.Я нашел метод CMSampleBufferCallForEachSample в документации, но не знаю, как его использовать, и нет примеров или объяснений.Пожалуйста, я уже некоторое время бегаю кругами с этой штукой, кто-нибудь может помочь?

1 Ответ

0 голосов
/ 22 июля 2012

Я решал подобную проблему.Мне нужно было разделить образцы AAC из одного SampleBuffer.

    ...
    CMSampleBufferCallForEachSample(sampleBuffer, &sampler, NULL);
    ...

static OSStatus sampler(CMSampleBufferRef sampleBuffer, CMItemCount index, void *refcon) {
    CMTime presentationTimeStamp = CMSampleBufferGetOutputPresentationTimeStamp(sampleBuffer);
    CMBlockBufferRef buff = CMSampleBufferGetDataBuffer(sampleBuffer);
    UInt32 timeStamp = (1000*presentationTimeStamp.value) / presentationTimeStamp.timescale;
    size_t size = CMBlockBufferGetDataLength(buff);

    void *sampleData = malloc(size);
    CMBlockBufferCopyDataBytes(buff, 0, size, sampleData);
    NSData * data = [NSData dataWithBytes:sampleData length:size];
    NSLog(@"Audio %ldx samples of size %lu has been transfered at time %ld", CMSampleBufferGetNumSamples(sampleBuffer), size, timeStamp); 
}

, но обратный вызов вызывается только один раз для первого сэмпла в каждом sampleBuffer, даже если существует массив из 76 сэмплов, а CMSampleBufferGetNumSamples возвращает это число

я нашел отличное решение здесь (метод fillMovieSampleBuffer, строка 283)

для документации инфраструктуры CoreMedia проверьте этот URL

@function   CMSampleBufferCallForEachSample
@abstract   Calls a function for every individual sample in a sample buffer.
@discussion Temporary sample buffers will be created for individual samples,
referring to the sample data and containing its timing, size and attachments.
The callback function may retain these sample buffers if desired.
If the callback function returns an error, iteration will stop immediately
and the error will be returned.

If there are no sample sizes in the provided sample buffer, kCMSampleBufferError_CannotSubdivide will be returned.
This will happen, for example, if the samples in the buffer are non-contiguous (eg. non-interleaved audio, where
the channel values for a single sample are scattered through the buffer).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...