17

AVAssetExportSession に問題があり、進行状況の増加が止まりますが、ステータスはまだエクスポート中であると表示されます。これは実際には非常にまれなケースで、約 99.99% の確率で問題なく動作しますが、とにかく問題を修正したいと考えています。

だから私はエクスポートを開始します:

    exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetMediumQuality];
    exportSession.videoComposition = videoComposition; 
    exportSession.outputFileType = @"com.apple.quicktime-movie";
    exportSession.outputURL = outputURL;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        ...
    }];

次に、進行状況をチェックするタイマーを設定します。

    AVAssetExportSessionStatus status = [exportSession status];
    float progress = 0;
    if (status == AVAssetExportSessionStatusExporting) {
        progress = [exportSession progress];
    } else if (status == AVAssetExportSessionStatusCompleted) {
        progress = 1;
    }
    NSLog(@"%d %f", status, progress);
    [delegate processor:self didProgress:progress];

出力は次のようになります。

2012-05-23 14:28:59.494 **********[1899:707] 2 0.125991
2012-05-23 14:28:59.994 **********[1899:707] 2 0.185280
2012-05-23 14:29:00.494 **********[1899:707] 2 0.259393
2012-05-23 14:29:00.994 **********[1899:707] 2 0.326093
2012-05-23 14:29:01.494 **********[1899:707] 2 0.400206
2012-05-23 14:29:01.995 **********[1899:707] 2 0.481729
2012-05-23 14:29:02.495 **********[1899:707] 2 0.541019
2012-05-23 14:29:02.997 **********[1899:707] 2 0.622542
2012-05-23 14:29:03.493 **********[1899:707] 2 0.681832
2012-05-23 14:29:03.995 **********[1899:707] 2 0.763355
2012-05-23 14:29:04.494 **********[1899:707] 2 0.822645
2012-05-23 14:29:04.994 **********[1899:707] 2 0.880082
2012-05-23 14:29:05.493 **********[1899:707] 2 0.880082
2012-05-23 14:29:05.994 **********[1899:707] 2 0.880082
...
2012-05-23 14:43:22.994 **********[1899:707] 2 0.880082
2012-05-23 14:43:23.493 **********[1899:707] 2 0.880082
2012-05-23 14:43:23.994 **********[1899:707] 2 0.880082
2012-05-23 14:43:24.494 **********[1899:707] 2 0.880082

(注: 毎回同じパーセンテージで停止するわけではなく、完全にランダムです)

タイムスタンプからわかるように、最初の 88% を実行するのに 5 秒かかり、その後、進行状況に変化がなく、さらに 13 分間実行しました (通常、完全なビデオ処理には 10 秒以上かかりません)。

現在、私の唯一のオプションは、進行状況が最後の X 秒で変化していないかどうかを確認し、失敗したことをユーザーに伝えて再試行することです。

誰にもアイデアはありますか?

4

4 に答える 4

3

私はそれを見つけました!

正しいlayerInstructionsを設定する必要があります:

AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];


AVMutableVideoCompositionLayerInstruction * layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:track];


AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, allTime);
MainInstruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];

そうでなければ、それはただ立ち往生しました。

于 2013-02-17T20:47:05.727 に答える
2

タイマーとエクスポーターが異なるスレッドで終了する場合、スレッドの問題であるかどうか疑問に思っています。(AVFoundation ガイドによると、エクスポーターは特定のスレッドでの実行が保証されていません。)

タイマーの代わりにキー値監視を使用してみましたか?

ベアボーンの例:

// register for the notification
[exportSession addObserver:someProcessor forKeyPath:@"progress" options:NSKeyValueObservingOptionNew context:NULL];

次に、プロセッサで:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    // add some checks here
    NSNumber *processNumber = [change objectForKey:NSKeyValueChangeNewKey];
    float process = [processNumber floatValue];
    [delegate processor:self didProgress:progress];
}
于 2013-02-23T05:46:06.227 に答える