11

私はこの問題に1週間以上苦労しています。誰かが私が間違っていることを理解してくれることを願っています。finishWriting メソッドは非推奨になったため、finishWritingWithCompletionHandler: メソッドを使用しようとしています。私は新しい方法を使用して成功したことはありません。不明なエラー -11800 で失敗します。非推奨の方法を使用して MOV ファイルを保存することはできますが、新しい方法で同等のものを作成すると、毎回失敗します。

これが私の元のコードです:

dispatch_async(movieWritingQueue, ^{
    if ([self.assetWriter finishWriting]) {
        self.assetWriterAudioIn = nil;
        self.assetWriterVideoIn = nil;
        //[assetWriter release];  ARC will not allow this line.
        self.assetWriter = nil;

        self.readyToRecordVideo = NO;
        self.readyToRecordAudio = NO;

        [self.delegate movieReadyToSaveForMovieProcessor:self];
    }
    else {
        [self displayError:[assetWriter error]];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self resumeCaptureSession];
        });
    }
}];

私の新しい方法は次のとおりです。

dispatch_async(movieWritingQueue, ^{
    [self.assetWriter finishWritingWithCompletionHandler:^{
        if (self.assetWriter.status != AVAssetWriterStatusFailed && self.assetWriter.status == AVAssetWriterStatusCompleted) {
            self.assetWriterAudioIn = nil;
            self.assetWriterVideoIn = nil;
            self.assetWriter = nil;

            self.readyToRecordAudio = NO;
            self.readyToRecordVideo = NO;

            [self.delegate movieReadyToSaveForMovieProcessor:self];
        } else {
            [self displayError:self.assetWriter.error];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self resumeCaptureSession];
            });
        }
    }];
}];

私は何も見逃していないと思いますし、スローされたエラーからあまり得られていません。どんな助けでも大歓迎です。

ありがとう、ロブ

4

3 に答える 3

23

私はついに答えを見つけました。オブジェクトに対してfinishWritingWithCompletionHandler:を実行しなかったため、 は失敗していましmarkAsFinishedた。の前にメソッドAVAssetWriterInputを実行すると、プロセスはエラーなしで完了することができました。markAsFinishedfinishWritingWithCompletionHandler:

于 2013-02-11T03:55:48.213 に答える
11

同様の問題があり、呼び出しのAVAssetWriter直後にを解放したため、ハンドラーが呼び出されないことがわかりました。finishWritingWithCompletionHandler:

[self.assetWriter finishWritingWithCompletionHandler:^{
    ...
}]

self.assetWriter = nil;

これを修正するには、リリース行を完了ハンドラ内に移動するだけです:

[self.assetWriter finishWritingWithCompletionHandler:^{
    ...
    self.assetWriter = nil;
}]
于 2013-06-20T05:39:46.357 に答える
3

答えは、calling を削除することfinishWritingWithCompletionHandlerでした。どうやら、関数はすでに一度呼び出されています。

于 2015-05-30T13:29:29.667 に答える