2011-05-11 61 views
1

嘿傢伙......我在我的智慧結束在這裏。在過去的三天裏,我一直關注這個問題,而且我還沒有接近解決這個問題。我在後臺線程中一個接一個地轉換視頻隊列。大多數時候它按預期工作,但每隔一段時間,我就會發生一次奇怪的崩潰,總是處於同一點。我不能爲了我的生活找出它爲什麼會發生。我已經啓用了垃圾回收。這是我的轉換代碼。令人難以置信的QTMovie出口崩潰

以下是堆棧跟蹤。

編輯:經過多一點調試,我回到了結論,也許它是垃圾回收器相關。如果我將下列行放在轉換視頻的行之前,我會看到這些錯誤的數量急劇增加,我看到...

[[NSGarbageCollector defaultCollector] collectExhaustively];

NSInvalidArgumentException 

-[NSPathStore2 objectForKey:]: unrecognized selector sent to instance 0x1073570 

(
    0 CoreFoundation      0x92fc16ba __raiseError + 410 
    1 libobjc.A.dylib      0x901b4509 objc_exception_throw + 56 
    2 CoreFoundation      0x9300e90b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x92f67c36 ___forwarding___ + 950 
    4 CoreFoundation      0x92f67802 _CF_forwarding_prep_0 + 50 
    5 QTKit        0x903d3280 MovieProgressProc + 62 
    6 QuickTime       0x95a66062 convertFileProgress + 212 
    7 QuickTime3GPP      0x1e7bcaa2 Spit3GP2_Progress + 180 
    8 QuickTime3GPP      0x1e7c01d8 Spit3GP2_FromProceduresToDataRef + 3438 
    9 CarbonCore       0x90b0d054 _ZL38CallComponentFunctionCommonWithStoragePPcP19ComponentParametersPFlvEm + 54 
    10 QuickTime3GPP      0x1e7be33d Spit3GP2_ComponentDispatch + 129 
    11 CarbonCore       0x90b057c9 CallComponentDispatch + 29 
    12 QuickTime       0x95befb97 MovieExportFromProceduresToDataRef + 49 
    13 QuickTime3GPP      0x1e7bdf84 Spit3GP2_ToDataRef + 1987 
    14 CarbonCore       0x90b1865d callComponentStorage_4444444 + 63 
    15 CarbonCore       0x90b0d054 _ZL38CallComponentFunctionCommonWithStoragePPcP19ComponentParametersPFlvEm + 54 
    16 QuickTime3GPP      0x1e7be33d Spit3GP2_ComponentDispatch + 129 
    17 CarbonCore       0x90b057c9 CallComponentDispatch + 29 
    18 QuickTime       0x95befbe2 MovieExportToDataRef + 73 
    19 QuickTime       0x95a6e9bb ConvertMovieToDataRef_priv + 1690 
    20 QuickTime       0x95bdc591 ConvertMovieToDataRef + 71 
    21 QTKit        0x903e0954 -[QTMovie_QuickTime writeToDataReference:withAttributes:error:] + 2692 
    22 QTKit        0x903c5110 -[QTMovie_QuickTime writeToFile:withAttributes:error:] + 111 
    23 Mevee        0x0005871d -[ConversionQueue convertVideo:] + 509 
    24 Mevee        0x00058341 -[ConversionQueue startConvertingItems] + 145 
    25 Foundation       0x9520fbf0 -[NSThread main] + 45 
    26 Foundation       0x9520fba0 __NSThread__main__ + 1499 
    27 libSystem.B.dylib     0x9475a85d _pthread_start + 345 
    28 libSystem.B.dylib     0x9475a6e2 thread_start + 34 
) 

- (id) init 
     { 
      if(!(self = [super init])) return self; 

      convertingIndex = 0; 
      conversionPaths = [[NSMutableArray alloc] init]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/2 Fast 2 Furious/2 Fast 2 Furious.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/101 Dalmations/101 Dalmations.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/300/300.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/1408/1408.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/A Few Good Men/A Few Good Men.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/A Goofy Movie/A Goofy Movie.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/A Single Man/A Single Man.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/A View to a Kill/A View to a Kill.mp4"]; 
      [conversionPaths addObject:@"/Users/Morgan/Desktop/Convertable Media/Movies/Across the Universe/Across the Universe.mp4"]; 

      backgroundThread = [[NSThread alloc] initWithTarget:self selector:@selector(startConvertingItems) object:nil]; 
      [backgroundThread start]; 

      return self; 
     } 

     - (void) startProcessingQueue 
     { 

     } 

     - (void) startConvertingItems 
     { 
      NSInteger iterations = 0; 
      while(iterations < 100) 
      { 
       NSString* nextPath = [conversionPaths objectAtIndex:convertingIndex]; 

       NSLog(@"ITERATION %d", iterations); 
       [self convertVideo:nextPath]; 

       convertingIndex += 1; 
       if(convertingIndex >= [conversionPaths count]) 
        convertingIndex = 0; 

       iterations += 1; 
      } 
     } 

     - (void) openMovieOnMainThread:(NSString*)path 
     { 
      NSError* error = nil; 
      movie = [[QTMovie alloc] initWithFile:path error:&error]; 

      if(movie == nil || error != nil || ![movie detachFromCurrentThread]) 
       movie = nil; 
     } 

     - (void) closeMovieOnMainThread 
     { 
      //[movie attachToCurrentThread]; 
      //[movie release]; 
     } 

     - (BOOL) convertVideo: (NSString*)path 
     { 
      [self performSelectorOnMainThread:@selector(openMovieOnMainThread:) withObject:path waitUntilDone:YES]; 

      if(movie == nil) { 
       NSLog(@"ERROR OPENING MOVIE"); 
       return NO; 
      } 

      [QTMovie enterQTKitOnThreadDisablingThreadSafetyProtection]; 
      [movie attachToCurrentThread]; 
      [movie setDelegate:self]; 

      NSString* tempItemPath = @"/Users/Morgan/Desktop/test.mp4"; 

      NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], QTMovieExport, 
            [NSNumber numberWithLong:'3gpp'], QTMovieExportType, 
            nil]; 

      NSError* error = nil; 

      if(![movie writeToFile:tempItemPath withAttributes:attrs error:&error]) { 
       NSLog(@"ERROR CONVERTING MOVIE"); 
       return NO; 
      } 

      [movie invalidate]; 
      [movie detachFromCurrentThread]; 

      [QTMovie exitQTKitOnThread]; 
      [self performSelectorOnMainThread:@selector(closeMovieOnMainThread) withObject:nil waitUntilDone:YES]; 

      return YES; 
     } 

     - (BOOL)movie:(QTMovie *)aMovie shouldContinueOperation:(NSString *)op withPhase:(QTMovieOperationPhase)phase atPercent:(NSNumber *)percent withAttributes:(NSDictionary *)attributes 
     { 
      switch (phase) 
      { 
       case QTMovieOperationBeginPhase: 
        NSLog(@"Conversion started"); 
        break; 
       case QTMovieOperationUpdatePercentPhase: 
        NSLog(@"Conversion progress: %f", [percent floatValue]); 
        break; 
       case QTMovieOperationEndPhase: 
        NSLog(@"Conversion finished."); 
        break; 
      } 

      return YES; 
     } 

回答

1

啊......我發現這是愚蠢的垃圾收集器。重做了我的應用程序,使用引用計數而不是垃圾收集,並且順利航行。是否有其他人遇到類似的垃圾回收錯誤?我有一個強烈的參考我的電影文件的根對象,所以我不認爲這是問題。

+0

感謝您發佈此問題 - 我一直有完全相同的問題。在更新進度指示器所需的電影上設置委派時,我經常會看到這種情況。我的問題應該通過關閉垃圾回收來解決。我希望... – 2011-07-08 17:35:44

相關問題