Я пытаюсь извлечь необработанные сэмплы PCM из MP3 в библиотеке iPod, чтобы я мог воспроизводить песню и управлять высотой звука, темпом и применять звуковые эффекты (например, фильтры).Я уже пошел по пути AVPlayer и AVAudioPlayer, которые оба вообще не позволяют очень сильно контролировать воспроизведение.
Код, приведенный ниже, насколько я получил с этим.Сейчас я нахожусь в точке, где я не знаю, что делать с CMSampleBufferRef в моем цикле while, потому что я не знаю, какую инфраструктуру использовать для воспроизведения аудио и применения таких эффектов.
Любая идея, чтобудет лучшим подходом для достижения этого?Я рассмотрел случаи, когда файл конвертировался с помощью AVAssetWriter, но это не поможет мне, потому что этот процесс занимает слишком много времени.Конечно, я могу просто прочитать сэмплы PCM в память для воспроизведения без необходимости сначала записывать их на диск?
Примечание: я знаю, что приведенный ниже код ссылается на mp3 в проекте, но я знаю, что этот подход будет работатьтак же, как если бы я вытягивал NSURL из MPMediaPropertyAssetURL
-(IBAction)loadTrack:(id)sender {
NSString *songPath = [[NSBundle mainBundle] pathForResource:@"Smooth_Sub Focus_192" ofType:@"mp3"];
NSURL *assetURL = [[NSURL alloc] initFileURLWithPath:songPath];
AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil];
NSError *assetError = nil;
AVAssetReader *assetReader = [[AVAssetReader assetReaderWithAsset:songAsset
error:&assetError] retain];
if (assetError) {
NSLog (@"Error: %@", assetError);
return;
}
AVAssetReaderOutput *assetReaderOutput = [[AVAssetReaderAudioMixOutput assetReaderAudioMixOutputWithAudioTracks:songAsset.tracks
audioSettings: nil] retain];
if (![assetReader canAddOutput:assetReaderOutput]) {
NSLog (@"Incompatible Asser Reader Output");
return;
}
[assetReader addOutput: assetReaderOutput];
[assetReader startReading];
CMSampleBufferRef nextBuffer;
while (nextBuffer = [assetReaderOutput copyNextSampleBuffer]) {
/* What Do I Do Here? */
}
[assetReader release];
[assetReaderOutput release];
}