2

についてはあまり情報がなくAVAssetImageGenerator、さらに少ないcancelAllCGImageGenerationようですので、これがバグでないことを願っています.

私は呼び出しgenerateCGImagesAsynchronouslyForTimesて、フレームを正常に取得しています。ファイル全体を処理させれば、すべて問題ありません。しかし、私がcancelAllCGImageGeneration...

...キャンセルには時間がかかります - これは奇妙ですが、大したことではありません。

...要求されたフレームごとに完了ブロックを呼び出し続け、その結果AVAssetImageGeneratorCancelled- これは奇妙な設計の選択であり、非常に不便です。

しかし、主な問題は、一連の呼び出しの後、再びAVAssetImageGeneratorCancelled呼び出しを開始することです。AVAssetImageGeneratorSucceeded何か案は?

(キャンセル時にフラグを設定し、その後画像を無視することでこれを回避できますが、ユーザーは別のビデオで操作を再開できるため、ロジックが混乱します。また、あちこちで「メモリ不足」エラーが発生しています.)

コード:

AVURLAsset* asset = [AVURLAsset URLAssetWithURL:self.cameraSelection.movieURL options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]];
NSTimeInterval duration = CMTimeGetSeconds(asset.duration);
float fps = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0].nominalFrameRate;
int frames = duration * fps;

NSMutableArray* requestedTimes = [NSMutableArray array];
for( int i=0; i<frames; i++ )
{
    [requestedTimes addObject:[NSValue valueWithCMTime:CMTimeMake(i, fps)]];
}

assetImageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
assetImageGenerator.requestedTimeToleranceBefore = kCMTimeZero;
assetImageGenerator.requestedTimeToleranceAfter = kCMTimeZero;
[assetImageGenerator generateCGImagesAsynchronouslyForTimes:requestedTimes completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error)
 {
     NSString* resultStr;
     switch (result)
     {
         case AVAssetImageGeneratorSucceeded:   resultStr = @"AVAssetImageGeneratorSucceeded";  break;
         case AVAssetImageGeneratorFailed:      resultStr = @"AVAssetImageGeneratorFailed"; break;
         case AVAssetImageGeneratorCancelled:   resultStr = @"AVAssetImageGeneratorCancelled";  break;
     }
     CFStringRef requestedTimeString = CMTimeCopyDescription(kCFAllocatorDefault, requestedTime);
     CFStringRef actualTimeString = CMTimeCopyDescription(kCFAllocatorDefault, actualTime);
     NSLog(@"%@ requestedTime:%@ actualTime:%@ error:%@", resultStr, (NSString*)requestedTimeString, (NSString*)actualTimeString, error);
     CFRelease(requestedTimeString);
     CFRelease(actualTimeString);
 }];

ログ:

2013-07-01 12:23:54.815 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{0/60 = 0.000} actualTime:{0/600 = 0.000} エラー:(null)
2013-07-01 12:23:54.864 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{1/60 = 0.017} 実際の時間:{10/600 = 0.017} エラー:(null)
2013-07-01 12:23:54.894 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{2/60 = 0.033} 実際の時間:{20/600 = 0.033} エラー:(null)
2013-07-01 12:23:54.950 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{3/60 = 0.050} 実際の時間:{30/600 = 0.050} エラー:(null)
2013-07-01 12:23:54.964 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{4/60 = 0.067} 実際の時間:{40/600 = 0.067} エラー:(null)
*** ここでキャンセル ***
2013-07-01 12:23:56.137 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{53/60 = 0.883} 実際の時間:{530/600 = 0.883} エラー:(null)
2013-07-01 12:23:56.138 ImprovEyes[9114:907] assetImageGenerator cancelAllCGImageGeneration
2013-07-01 12:23:56.210 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{54/60 = 0.900} 実際の時間:{540/600 = 0.900} エラー:(null)
2013-07-01 12:23:56.230 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{55/60 = 0.917} 実際の時間:{550/600 = 0.917} エラー:(null)
*** しばらく画像を受信し続けてから停止 ***
2013-07-01 12:23:57.019 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{90/60 = 1.500} actualTime:{900/600 = 1.500} エラー:(null)
2013-07-01 12:23:57.036 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{91/60 = 1.517} 実際の時間:{910/600 = 1.517} エラー:(null)
2013-07-01 12:23:57.046 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{92/60 = 1.533} actualTime:{INVALID} エラー:(null)
2013-07-01 12:23:57.056 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{93/60 = 1.550} actualTime:{INVALID} エラー:(null)
*** 画像が再び到着し始めます! ***
2013-07-01 12:24:01.234 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{538/60 = 8.967} actualTime:{INVALID} エラー:(null)
2013-07-01 12:24:01.241 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{539/60 = 8.983} actualTime:{INVALID} エラー:(null)
2013-07-01 12:24:01.249 ImprovEyes[9114:1903] AVAssetImageGeneratorCancelled requestedTime:{540/60 = 9.000} actualTime:{INVALID} エラー:(null)
2013-07-01 12:24:01.259 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{541/60 = 9.017} 実際の時間:{5410/600 = 9.017} エラー:(null)
2013-07-01 12:24:01.270 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{542/60 = 9.033} 実際の時間:{5420/600 = 9.033} エラー:(null)
2013-07-01 12:24:01.279 ImprovEyes[9114:1903] AVAssetImageGeneratorSucceeded requestedTime:{543/60 = 9.050} 実際の時間:{5430/600 = 9.050} エラー:(null)
...
4

1 に答える 1