如何正确地停止和删除iOS11中的audioTapProcessor
我正在使用类似于apple的audioTap示例的audioTapProcessor 。
基本上,audioTapProcessor被创build并添加到audioMix:
MTAudioProcessingTapRef audioProcessingTap; if (noErr == MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PreEffects, &audioProcessingTap)) { audioMixInputParameters.audioTapProcessor = audioProcessingTap; CFRelease(audioProcessingTap); audioMix.inputParameters = @[audioMixInputParameters]; _audioMix = audioMix; }
当创buildaudioMix时,它被添加到avPlayer的currentItem中:
self.avPlayer.currentItem.audioMix = audioMix;
当我完成audioTapProcessor时,我清除对audioTapProcessor和audioMix的引用:
if (self.avPlayer.currentItem.audioMix){ for (AVMutableAudioMixInputParameters *inputParameter in player.currentItem.audioMix.inputParameters) { inputParameter.audioTapProcessor = nil; } player.currentItem.audioMix = nil; }
这触发tap_UnprepareCallback和tap_FinalizeCallback函数,并且audioTapProcessor对象被取消分配。
这个工作没有任何问题,直到iOS11几天前出来。
在iOS11设备上,我有时会在ClientProcessingTapManager线程上收到EXC_BAD_ACCESS错误。 该错误发生在AVFoundation的其中一个类中,所以我无法debugging。 该错误发生在ClientProcessingTap :: PerformTap的某处。
我已经将日志logging添加到了audioTapcallback函数,并且它看起来像在ClientProcessingTapManager线程上只执行tap_ProcessCallBack。
我认为有时在此线程上触发audioTapProcessor的tap_ProcessCallback方法,而实际的AudioTapProcessor已在另一个线程上解除分配。
我的问题是:如何正确地停止audioTapProcessor并将其从内存中删除?
这是一些输出logging的例子:
2017-09-22 12:49:26:171 xx[1261:780894] cleaning up audioMix of AvPlayer 2017-09-22 12:49:26:213 xx[1261:781173] into tap_ProcessCallback. thread: ClientProcessingTapManager 2017-09-22 12:49:26:213 xx[1261:781173] end of tap_ProcessCallback 2017-09-22 12:49:26:217 xx[1261:781127] into tap_UnprepareCallback. 2017-09-22 12:49:26:218 xx[1261:781127] end of tap_UnprepareCallback 2017-09-22 12:49:26:218 xx[1261:781127] into tap_FinalizeCallback. 2017-09-22 12:49:26:218 Tunify[1261:781127] end of tap_FinalizeCallback 2017-09-22 12:49:26:218 Tunify[1261:781127] into MYAudioTapProcessor dealloc. (lldb)
很高兴知道:
我是一个avPlayers池,所以我重新使用这些对象。 当我不清除avPlayers的audioMix时,我不会遇到这个错误。 如果没有清理audioMix对象,则只有在重新使用avPlayer并将新的audioMix分配给avPlayer时才会释放audioTapProcessors。
我发现一个相关的问题 ,但我已经触发清理function。 那里的解决scheme在iOS11设备上给出了相同的错误
这是iOS 11下的AVFoundation中的一个错误。您应该将其报告给Apple。 针对该问题的雷达rdar:// 34977000
可能的解决方法是在释放AVPlayer / AVPlayerItem之前调用prepareReleaseAudioMix
+ (void)prepareReleaseAudioMix:(AVAudioMix*)audioMix { if ( @available(iOS 11.0, *) ) { // Starting with iOS 11, it is not required to manually nil audioTapProcessor, // but we need to retain the audioMix for a bit to make sure the processing callback // will not be called after we release (this is due to a bug in iOS 11 which calls the release // callback but still calls the processing callback afterwards - it also releases internal data // on release, so simply checking for release in the processing block is not enough) // rdar://34977000 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self _prepareReleaseAudioMixNow:audioMix]; }); } else { // Prior to iOS 11 we need to manually nil the audioTapProcessor [self _prepareReleaseAudioMixNow:audioMix]; } } + (void)_prepareReleaseAudioMixNow:(AVAudioMix*)audioMix { for ( AVMutableAudioMixInputParameters *parameters in audioMix.inputParameters ) { if ( ![parameters isKindOfClass:[AVMutableAudioMixInputParameters class]] ) continue; parameters.audioTapProcessor = nil; } }
- AVAssetWriter输出(UIImage写入video)失真
- 使用AVMutableComposition编写video和audio
- 使用AVCaptureSession录制video时,音乐应用程序(在后台播放)会中断
- Swift:如何从AVFoundation拍摄的照片中删除EXIF数据?
- 从UITableViewCell上的多个AVPlayerItem中添加和删除观察者
- AVFoundation在预览中将图像的方向偏离90度,但在相机图像的方向上偏好
- 如何获得另一个应用程序正在播放的audio
- 如何在没有用户交互的情况下从iOS相机捕捉图像?
- 如何使用swift监视ios上的audioinput – 示例?