18

AVAssetWriter を使用していますが、iOS6 で完全に動作しています。

問題は、私が呼び出したときにfinishWritingWithCompletionHandler、iOS7 GM で完了ハンドラーが呼び出されないことです。

を呼び出しましたがmarkAsFinishedendSessionAtSourceTimefinishWritingWithCompletionHandler を呼び出す前に.

iOS6では問題なく動作します。

さらに、iOS7 では、動作することもあれば、再び動作しないこともあります。

理由はわかりませんが、アラートビューを使用してメソッドを呼び出すと機能します。だから私は試しperformSelectorOnMainThreadてみinBackgroundましたが、役に立ちませんでした。

何か案は?

4

5 に答える 5

38

どうやら、今は assetWriter を保持する必要があるようです。

強力なプロパティを保持して、完了ハンドラーが呼び出されるかどうかを確認してください。(完了ハンドラーでそのプロパティを必ず nil にしてください。)

于 2013-09-17T19:15:44.797 に答える
8

レイ・フィックス、その通りです。assetWriter を保持する必要があります。最も簡単な方法は、finishWritingWithCompletionHandler ブロック内で使用することです。

        NSError *error = nil;

        AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:path]
                                                                   fileType:AVFileType3GPP
                                                                      error:&error];
        //startWriting, session etc.  

        [videoWriter finishWritingWithCompletionHandler:^{
                NSLog(@"%@",videoWriter);
                NSLog(@"Write Ended");
            }];
于 2013-11-07T09:17:34.303 に答える
3

アセットライターを保持することは非常に重要ですが、アセットライターがすべて保持されている (そして再利用されていない) にもかかわらず、非常に奇妙な断続的な障害に遭遇しました。私のファイル名はすべて CACurrentMediaTime() に基づいており、ディレクトリを変更しないため、問題はファイル名の衝突やディレクトリの欠落でもありませんでした。

endSessionAtSourceTime:毎回アセットライターを設定しないと、非常にまれな (しかし再現可能な) 完了ハンドラーfinishWritingWithCompletionHandler:が呼び出されない可能性があるようです。数秒待ってアセットライターのステータスを確認すると、AVAssetWriterStatusFailure 状態になり、エラーは説明のない「不明なエラーが発生しました (-12763)」になります。さらに、assetwriter のファイル形式を変更しても、この問題には影響がないようです。最後に、この問題はおそらく、ムービーを何度もすばやく録画する必要がある場合にのみ問題になります (失敗する可能性はおそらく 1/15 ~ 1/20 です)。

したがって、assetwriter に渡す最後のサンプルのプレゼンテーション タイム スタンプを必ず保存し、 を呼び出すendSessionAtSourceTime:直前にそのサンプル時間で呼び出すようにしてくださいfinishWritingWithCompletionHandler:

于 2014-05-30T23:34:15.573 に答える
1

宛先ディレクトリが存在しない場合にも発生する可能性があります。この場合、書き込みは正常に機能しますが、ファイルは作成されず、ブロックは呼び出されません。

于 2014-03-10T08:12:03.243 に答える