2015-03-17 25 views
6

Tôi gặp sự cố lạ trong ứng dụng xử lý video của mình. Nó sử dụng AVFoundation để hoạt động với video & âm thanh và GPUImage để lọc. Tôi chưa bao giờ phải đối mặt với vấn đề này, nhưng sau khi phát hành nó vào App Store nó xuất hiện trong Crashlytics khá thường xuyên. Dưới đây là nhật ký của vụ tai nạn:__copy_helper_block_ crash trong AVFoundation

Thread : Crashed: AVPlayerItemOutput queue 
0 libobjc.A.dylib    0x00000001986f80b4 objc_retain + 20 
1 libsystem_blocks.dylib   0x0000000198d79bf8 _Block_object_assign + 320 
2 AVFoundation     0x0000000186895a34 __copy_helper_block_171 + 36 
3 libsystem_blocks.dylib   0x0000000198d79738 _Block_copy_internal + 384 
4 libdispatch.dylib    0x0000000198d252fc _dispatch_Block_copy + 36 
5 libdispatch.dylib    0x0000000198d2685c dispatch_async + 68 
6 AVFoundation     0x00000001868959ac -[AVPlayerItemVideoOutput _dispatchOutputSequenceWasFlushed] + 112 
7 libdispatch.dylib    0x0000000198d2536c _dispatch_client_callout + 16 
8 libdispatch.dylib    0x0000000198d2e6e8 _dispatch_barrier_sync_f_invoke + 76 
9 AVFoundation     0x00000001868940a8 AVPlayerItemVideoOutput_figVCSequentialAvailable + 196 
10 MediaToolbox     0x000000018a3c16f8 FigVisualContextImageAvailableSequential + 108 
11 MediaToolbox     0x000000018a348ce8 itemremote_postNotificationWithPayload + 3996 
12 MediaToolbox     0x000000018a342d60 FigPlayerRemoteCallbacksServer_SendNotifyPing + 924 
13 MediaToolbox     0x000000018a342998 _XSendNotifyPing + 60 
14 MediaToolbox     0x000000018a33f0d4 figmoviecallbacks_server + 112 
15 MediaToolbox     0x000000018a33f018 fpr_ClientPortCallBack + 208 
16 CoreFoundation     0x0000000187f44ce0 __CFMachPortPerform + 180 
17 CoreFoundation     0x0000000187f598fc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56 
18 CoreFoundation     0x0000000187f5985c __CFRunLoopDoSource1 + 436 
19 CoreFoundation     0x0000000187f577dc __CFRunLoopRun + 1640 
20 CoreFoundation     0x0000000187e851f4 CFRunLoopRunSpecific + 396 
21 GraphicsServices    0x00000001910135a4 GSEventRunModal + 168 
22 UIKit       0x000000018c7b6784 UIApplicationMain + 1488 
23 MerryVideoEditor    0x000000010024b804 main (main.m:16) 
24 libdyld.dylib     0x0000000198d4ea08 start + 4 

Đây là cách tôi kết nối AVFoundation-GPUImage:

class ProjectEditorViewController: UIViewController { 
    private var videoPlayerView = VideoPlayerView() 
    private var movieFile: GPUImageMovie! 
    private var currentComposition: AVComposition! 
    //...and other properties 
} 

// MARK: - Filtering & Playback 
extension ProjectEditorViewController{ 
    func updatePlayer() { 

     currentFilter.removeAllTargets() 
     movieFile?.removeAllTargets() 
     movieFile?.endProcessing() 

     let time = self.videoPlayerView.player?.currentItem.currentTime() ?? kCMTimeZero 

     let (composition, audioMix) = compositionBuilder.buildCompositionFromTimeLine(timeLine) 
     videoPlayerView.setAsset(composition) 
     videoPlayerView.playerItem.audioMix = audioMix 

     movieFile = GPUImageMovie(playerItem: videoPlayerView.player.currentItem) 
     currentFilter.applyFromOutput(movieFile, toInput: gpuPlayerView) 
     movieFile.startProcessing() 

     addSyncLayerIfNeededForComposition(composition) 

     videoPlayerView.player.seekToTime(time, toleranceBefore: kPlayerToleranceSeekTime, toleranceAfter: kPlayerToleranceSeekTime) 
     currentComposition = composition 

    } 

    func updatePlayerFilter(){   
     if movieFile != nil{ 
     movieFile.removeAllTargets() 
     currentFilter.applyFromOutput(movieFile, toInput: gpuPlayerView) 
     if(!videoPlayerView.isPlaying) { movieFile.startProcessing() } 
     addSyncLayerIfNeededForComposition(currentComposition) 
     }else{ 
     updatePlayer() 
     } 
    }  
} 

Bất cứ ý tưởng gì là sai với mã của tôi? Bất kỳ câu hỏi, ý kiến, gợi ý và câu trả lời được đánh giá cao.

+0

Chúng tôi vừa gặp phải sự cố tương tự trong ứng dụng của chúng tôi sử dụng GPUImage để xử lý video - chỉ cần tự hỏi liệu bạn có may mắn tìm được bản sửa lỗi không? – Greg

Trả lời

6

Đây là một vấn đề trong GPUImageMovie - khi dụ thêm chính nó như là AVPlayerItemVideoOutput đại biểu: [playerItemOutput setDelegate:self queue:videoProcessingQueue], playerItemOutput không công bố đại biểu của mình khi GPUImageMovie dụ được deallocating. Sau đó, điều này dẫn đến một cuộc gọi phương thức từ đối tượng được deallocated (outputSequenceWasFlushed:) và bạn nhận được sự cố. Điều này đã được tìm thấy với sự giúp đỡ của NSZombie dò và tôi cố định nó bằng cách thêm này trong GPUImageMovie phương pháp dealloc: [playerItemOutput setDelegate:nil queue:nil];

Chúc may mắn, Nikita;)

0

đoán hoang dã: một số smartass đã phá vỡ một cái gì đó trong AVFoundation trong 8.x Bằng cách nào đó tôi điều này có thể "chỉ làm việc" trong 7.x Nếu lý thuyết của tôi chảo ra bugreporter là da cách để đối phó với điều này (họ sẽ bắt đầu phớt lờ cáo lỗi mới ngay lập tức)

0

Tôi đồng ý với Igor, nhưng thiết playerItemOutput 's đại biểu để nil didn' t giúp tôi. Vì vậy, tôi đã thêm

runSynchronouslyOnVideoProcessingQueue(^{ 

    [playerItemOutput setDelegate: nil 
          queue: nil]; 
    [_playerItem removeOutput: playerItemOutput]; 
    playerItemOutput = nil; 
    }); 

trong endProcessing phương pháp sau hủy bỏ hiệu lực displayLink.

Hy vọng điều đó sẽ hữu ích.