Tôi đang cố gắng trích xuất các mẫu PCM thô từ MP3 trong Thư viện iPod để tôi có thể phát bài hát và điều chỉnh cường độ, tiến độ và áp dụng hiệu ứng âm thanh (chẳng hạn như bộ lọc). Tôi đã đi xuống các tuyến đường của AVPlayer và AVAudioPlayer mà cả hai không cho phép kiểm soát rất nhiều về phát lại ở tất cả.Trích xuất các mẫu PCM nguyên mẫu của Thư viện iPod và phát với các hiệu ứng âm thanh
Mã dưới đây là như xa như tôi đã nhận được với điều này. Tôi đang ở một thời điểm mà tôi không biết phải làm gì với CMSampleBufferRef trong vòng lặp của tôi vì tôi không biết sử dụng khung nào để phát lại âm thanh và áp dụng các hiệu ứng như vậy.
Bất kỳ ý tưởng nào sẽ là cách tiếp cận tốt nhất để đạt được điều này? Tôi đã xem xét các trường hợp tập tin được chuyển đổi bằng cách sử dụng một AVAssetWriter nhưng điều này sẽ không cắt nó cho tôi bởi vì quá trình này là quá tốn thời gian. Chắc chắn tôi chỉ có thể đọc các mẫu PCM vào bộ nhớ để phát lại mà không cần phải ghi chúng vào đĩa trước?
NB: Tôi biết mã bên dưới tham chiếu một mp3 trong dự án nhưng tôi nhận thức được rằng phương pháp này sẽ làm việc như nhau như thể tôi đang kéo một NSURL từ 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];
}
Tuyệt vời. Điều này giúp tôi một nửa ở đó. Tôi đã thực hiện một số nghiên cứu về các khung âm thanh và dường như khung duy nhất phù hợp với yêu cầu của tôi là OpenAL. Với một đường cong học tập dốc, điều này hơi ngắt nhưng tôi có thể sử dụng NSData với thứ gì đó như Finch không? – Dino
Tôi chưa từng sử dụng Finch, vì vậy tôi không chắc chắn liệu nó có chấp nhận trực tiếp NSData hay không. –
FYI: Tôi đã thử nó, và tôi đã nhận EXC_BAD_ACCESS ... Tôi có thể loại bỏ nó bằng cách kiểm tra OSStatus trả về bởi 'CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer' trước khi thực hiện' for'. – Larme