1

iOS6 では正常に動作していたアプリケーションの問題をトラブルシューティングしていますが、XCode 5 および iOS7 にアップグレードすると、AVAssetWriter が tmp ディレクトリ内のファイルへのビデオ データの書き込みを終了しました。AVFoundation と AVCaptureSession を使用してビデオをキャプチャしています。出力ファイルは録画の開始時に作成されますが、ビデオ データが読み込まれることはありません。finishWritingWithCompletionHandler はエラーなしで実行され、期待どおりに完了ハンドラーを呼び出します。

iOS6では不要だったiOS7で何か違うことをする必要があるかどうかは誰にも分かりますか? ドキュメントで何も見つけることができませんでした。

ここにいくつかの詳細情報があります...

一時ファイルの場所: /var/mobile/Applications/[アプリ ID]/tmp/[TempFileName].MOV

ビデオ サンプル バッファ サイズ: 1

オーディオ サンプル バッファ サイズ: 1024

どんな助けでも大歓迎です。

4

3 に答える 3

1

私もまったく同じシナリオを経験しましたが、これも iOS 7 でのみ発生しまし
た。

問題は、AVAssetWriter でのキャプチャが完了した後、書き込みが完了する前に、バックグラウンド スレッドで「finishWriting」を呼び出し、メディアにすぐにアクセスしていたことです。

'finishWritingWithCompletionHandler:' を使用して解決し、書き込みが完了した後にのみファイルにアクセスします (完了ハンドラーからのコールバック)。ハンドラーがバックグラウンド スレッドから呼び出されるため、メイン スレッドにディスパッチすることを忘れないでください。

それが役に立てば幸い

于 2013-10-03T12:26:27.003 に答える
0

アビシックは正しかった。iOS 7 より前は、 を含める必要はありませんでしassetWriter finishWritingWithCompletionHandlerたが、今では、含めないとファイルが使用できなくなります。説明するコードを次に示します。

[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue
                                                usingBlock:
^{
    CMSampleBufferRef nextBuffer;
    while (assetWriterInput.readyForMoreMediaData)
    {
        nextBuffer = [assetReaderOutput copyNextSampleBuffer];
        if (nextBuffer) {
            //...
        }
        else {
            [assetWriterInput markAsFinished];
            [assetReader cancelReading];
            [assetWriter finishWritingWithCompletionHandler:^{
                //notify your other code that the file is ready
               }];
            return;
        }
}
于 2013-10-14T21:53:48.453 に答える