AvAssetReader получает неправильный номер аудиосэмпла

Я пытаюсь получить звуковую дорожку из видео в виде необработанных данных PCM. План состоит в том, чтобы передать эти данные в массив таблиц с плавающей точкой * в libpd. Мне удалось получить некоторые данные выборки, но число зарегистрированных образцов слишком мало. Например, для 29-секундного клипа я получаю 3968 сэмплов. Что я с нетерпением жду, так это амплитуды в каждом образце. Для дорожки со звуком длительностью 29 секунд я ожидал бы иметь массив размером 1278900 (при 44,1 кГц).

Вот что я собрал на основе других примеров:

- (void)audioCapture {

NSLog(@"capturing");
NSError *error;

AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:self.videoAsset error:&error];

NSArray *audioTracks = [self.videoAsset tracksWithMediaType:AVMediaTypeAudio];

AVAssetTrack *audioTrack = nil;

if ([audioTracks count] > 0)
    audioTrack = [audioTracks objectAtIndex:0];

// Decompress to Linear PCM with the asset reader
NSDictionary *decompressionAudioSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                            [NSNumber numberWithUnsignedInt:kAudioFormatLinearPCM], AVFormatIDKey,
                                            nil];

AVAssetReaderOutput *output = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:audioTrack outputSettings:decompressionAudioSettings];
[reader  addOutput:output];


[reader startReading];

CMSampleBufferRef sample = [output copyNextSampleBuffer];

//array for our sample amp values
SInt16* samples = NULL;

//sample count;
CMItemCount numSamplesInBuffer = 0;

//sample buffer
CMBlockBufferRef buffer;

while( sample != NULL )
{
    sample = [output copyNextSampleBuffer];

    if( sample == NULL )
        continue;

    buffer = CMSampleBufferGetDataBuffer( sample );

    size_t lengthAtOffset;
    size_t totalLength;
    char* data;

    if( CMBlockBufferGetDataPointer( buffer, 0, &lengthAtOffset, &totalLength, &data ) != noErr )
    {
        NSLog( @"error!" );
        break;
    }

    numSamplesInBuffer = CMSampleBufferGetNumSamples(sample);

    AudioBufferList audioBufferList;

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
                                                            sample,
                                                            NULL,
                                                            &audioBufferList,
                                                            sizeof(audioBufferList),
                                                            NULL,
                                                            NULL,
                                                            kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
                                                            &buffer
                                                            );

    for (int bufferCount=0; bufferCount < audioBufferList.mNumberBuffers; bufferCount++) {
        samples = (SInt16 *)audioBufferList.mBuffers[bufferCount].mData;


        NSLog(@"idx %f",(double)samples[bufferCount]);
    }
}
NSLog(@"num samps in buf %ld",numSamplesInBuffer);

//[PdBase copyArray:(float *)samples 
     //toArrayNamed:@"DestTable" withOffset:0    
            //count:pdTableSize];

}

0 ответов

Другие вопросы по тегам