Hi, I'm trying to do some realtime audio processing on audio served from an HLS stream (i.e. an AVPlayer created using an M3U HTTP URL). And I find that new APIs(AVPlayerItemSampleBufferOutput) are available in iOS 27.0 to achieve it.
However, I failed to get the available data via the AVPlayerItemSampleBufferOutputDelegate. And I found some error in the system log:
I create AVPlayerItemSampleBufferOutput and set the delegate after receiving the AVPlayerItemStatusReadyToPlay event. And here's my code:
@interface OCAudioSamplebuffer () <AVPlayerItemSampleBufferOutputDelegate>
@property (nonatomic, strong) AVPlayerItemSampleBufferOutput *bufferOutput;
@property (nonatomic, strong) dispatch_queue_t bufferOutputQueue;
@property (nonatomic, strong) AVPlayerItem *playerItem;
@end
- (void)playItem:(AVPlayerItem *)item {
if (@available(iOS 27, *)) {
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if([NSThread mainThread]){
[audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];
}else{
dispatch_async(dispatch_get_main_queue(), ^{
[audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];
});
}
AVPlayerItemSampleBufferOutputAudioConfiguration *cfg = [[AVPlayerItemSampleBufferOutputAudioConfiguration alloc] init];
CMFormatDescriptionRef formatDescription = [self createPCMFormatDescriptionWithSampleRate:44100.0 channels:2 isFloat:YES];
cfg.requestedAudioFormat = formatDescription;
if (formatDescription) {
NSLog(@"create PCM Format Description success");
CFRelease(formatDescription);
} else {
NSLog(@"fail to create PCM Format Description");
}
self.bufferOutput = [[AVPlayerItemSampleBufferOutput alloc] initWithConfiguration:cfg];
NSLog(@"create buffer success, PCM Format Description%@---,%@", cfg.requestedAudioFormat, formatDescription);
self.bufferOutputQueue = dispatch_queue_create("audioSamplebufferQueue", DISPATCH_QUEUE_CONCURRENT);
[self.bufferOutput setDelegate:self queue:self.bufferOutputQueue];
[item addOutput:self.bufferOutput];
self.playerItem = item;
} else {
// Fallback on earlier versions
}
}
Any help.
Thank you