Próbuję wyodrębnić surowe próbki PCM z pliku MP3 w bibliotece iPoda, dzięki czemu mogę odtwarzać utwór i manipulować tonacją, tempem i zastosować efekty dźwiękowe (takie jak filtry). Przeszedłem już przez AVPlayer i AVAudioPlayer, które nie pozwalają na bardzo dużą kontrolę nad odtwarzaniem.Wyodrębnianie próbek pobranych z biblioteki iPoda z biblioteki PCM i odtwarzanie z efektami dźwiękowymi
Poniższy kod jest tak daleki, jak to zrobiłem. Jestem teraz w punkcie, w którym nie wiem, co zrobić z CMSampleBufferRef w mojej pętli while, ponieważ nie wiem, której struktury użyć, aby odtworzyć dźwięk i zastosować takie efekty.
Każdy pomysł, jakie byłoby najlepsze podejście, aby to osiągnąć? Przyjrzałem się przypadkom, w których plik jest konwertowany za pomocą zestawu AVAssetWriter, ale nie jest to dla mnie zbyt trudne, ponieważ proces ten jest zbyt czasochłonny. Z pewnością mogę po prostu odczytać próbki PCM w pamięci do odtwarzania bez uprzedniego zapisania ich na dysku?
NB: Wiem poniższy kod odwołuje mp3 w ramach projektu, ale zdaję sobie sprawę, że takie podejście będzie działać tak samo jak gdybym ciągnięcie bibliotece NSURL z 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];
}
Doskonałe. To doprowadza mnie do połowy. Robiłem badania nad frameworkami audio i wydaje mi się, że jedyną strukturą, która odpowiada moim wymaganiom jest OpenAL. Ze stromą krzywą uczenia się jest to nieco nieprzydatne, ale czy mogę użyć NSData z czymś podobnym do Fincha? – Dino
Sam nigdy nie używałem Fincha, więc nie jestem pewien, czy akceptuje on NSData. –
FYI: Próbowałem go i otrzymałem EXC_BAD_ACCESS ... mogłem go usunąć, sprawdzając OSStatus zwrócony przez 'CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer' przed wykonaniem' for'. – Larme