Browse Source

fix(iOS): AudioPlayer 野指针Crash

StyxS 4 years ago
parent
commit
b602afa236

+ 1 - 0
iOS/QGVAPlayer/QGVAPlayer/Classes/Controllers/QGAnimatedImageDecodeManager.h

@@ -53,6 +53,7 @@
 - (QGBaseAnimatedImageFrame *)consumeDecodedFrame:(NSInteger)frameIndex;
 - (QGBaseAnimatedImageFrame *)consumeDecodedFrame:(NSInteger)frameIndex;
 
 
 - (void)tryToStartAudioPlay;
 - (void)tryToStartAudioPlay;
+- (void)tryToStopAudioPlay;
 - (BOOL)containsThisDeocder:(id)decoder;
 - (BOOL)containsThisDeocder:(id)decoder;
 
 
 @end
 @end

+ 9 - 0
iOS/QGVAPlayer/QGVAPlayer/Classes/Controllers/QGAnimatedImageDecodeManager.m

@@ -97,6 +97,15 @@
     [_audioPlayer play];
     [_audioPlayer play];
 }
 }
 
 
+- (void)tryToStopAudioPlay {
+    if (!_audioPlayer) {
+        return;
+    }
+    // CoreAudio(AVAudioPlaeyrCpp)回调audioPlayerDidFinishPlaying:successfully:时在子线程,恰巧此时释放将可能导致野指针问题
+    // 如果只是stop不能解决,可以考虑产生循环持有并延迟释放_audioPlayer
+    [_audioPlayer stop];
+}
+
 #pragma mark - private methods
 #pragma mark - private methods
 
 
 - (BOOL)checkIfDecodeFinish:(NSInteger)frameIndex {
 - (BOOL)checkIfDecodeFinish:(NSInteger)frameIndex {

+ 1 - 0
iOS/QGVAPlayer/QGVAPlayer/Classes/UIView+VAP.m

@@ -134,6 +134,7 @@ NSInteger const VapMaxCompatibleVersion = 2;
     if (self.vap_metalView) {
     if (self.vap_metalView) {
         [self.vap_metalView dispose];
         [self.vap_metalView dispose];
     }
     }
+    [self.hwd_decodeManager tryToStopAudioPlay];
     [self.hwd_callbackQueue addOperationWithBlock:^{
     [self.hwd_callbackQueue addOperationWithBlock:^{
         //此处必须延迟释放,避免野指针
         //此处必须延迟释放,避免野指针
         if ([self.hwd_Delegate respondsToSelector:@selector(viewDidStopPlayMP4:view:)]) {
         if ([self.hwd_Delegate respondsToSelector:@selector(viewDidStopPlayMP4:view:)]) {