0

AVFoundation でムービーを録画すると、約 34 分でエラー コード -11813: AVErrorMaximumNumberOfSamplesForFileFormatReached で録画が自動的に停止します。

QuickTime ファイル形式の仕様について調査した結果、Atom ヘッダーには拡張サイズ フィールドが含まれていないようです。仕様は私に教えてくれます:

アトムのサイズ フィールドが 1 に設定されている場合、タイプ フィールドの後に 64 ビットの拡張サイズ フィールドが続きます。これには、アトムの実際のサイズが 64 ビットの符号なし整数として含まれます。これは、メディア データ アトムのサイズが 2^32 バイトを超える場合に使用されます。

どうやら拡張サイズ フィールドが存在しない場合 (サイズ フィールドに 2^32 バイトを超えて書き込むことができないアトムの実際のサイズが含まれている場合)、次のドキュメントに記載されています。

サイズ フィールドにアトムの実際のサイズが含まれている場合、拡張サイズ フィールドは存在しません。これは、データを追加することによって QuickTime アトムが変更され、そのサイズが 2^32 バイトの制限を超える場合、新しいアトム サイズを記録する拡張サイズ フィールドがないことを意味します。したがって、アトムの内容を新しいアトムにコピーせずに、2^32 バイトを超えてアトムを拡大することが常に可能であるとは限りません。

私はビデオとオーディオを持っているものAVCaptureMovieFileOutputから録音するために使用していますAVCaptureSessionAVCaptureDeviceInput

私の質問: サイズ フィールドを手動で 1 に設定するにはどうすればよいですか? または、AVCaptureMovieFileOutput を間違ったアプローチで使用していますか? AVAssetWriter アプローチを使用する必要がありますか? ライブ ビデオ グラバーとオーディオ入力からビデオとオーディオを録音しています。

この問題は、Apple 自身の AVRecorderによるサンプル プロジェクトで再現可能です。sessionPresets を変更しても問題は解決しません。

私の QTKit アプリケーションでは、この制限はありませんでした。QuickTime Player X 自体も、この 34 分の境界を超えて記録できます。

これは既知の問題ですか、それとも何か見逃していますか?

4

1 に答える 1

1

問題は解決しました。結局、ドライバーの更新の問題でした。

一般的な詳細:

Mac 環境でEpiphan DVI2USB SoloおよびDVI2USB 3.0フレーム グラバーを使用しています。
バージョン 3.27.7 以下のドライバーは動作しません。
この問題は、Epiphan による新しいドライバー アップデート 3.27.8 で対処され
います。変更 ログには、私が抱えていた問題が明示的に記載されています。

今それは動作します

技術的背景:

問題を QuickTime API メーリング リストに投稿しました。アップルとエピファンは答えた。Appleはそれを非常に正確に説明しました:

これはファイル サイズの問題ではありません。それは期間のタイムスケールの問題です。QT ムービー ファイルのデュレーション フィールドは 32 ビットのみで、ムービーのタイムスケールで表されます。Mac OS X では、AVCaptureMovieFileOutput はビデオ キャプチャ ソースのタイムスケールをムービーのタイムスケールとして使用して、精度を維持します (編集用)。ビデオ デバイスが 1000000 のタイムスケールを使用している場合、次のようになります。

2147483647 / 1000000 = 2147 秒、つまり 35 分です。

AVCaptureMovieFileOutputまた、セットアップでタイムスケールに影響を与えることはできません。CMSampleBufferRefとセットアップを使用する必要がありAVAssetWriterます。Apple は次のように述べています。

現在、AVCaptureMovieFileOutput のタイムスケールの選択に影響を与える方法はありません。ビデオ デバイスのタイムスケールを使用します。回避策の 1 つは、AVCaptureVideoDataOutput/AVCaptureAudioDataOutput を使用して、デリゲート コールバックに送信されるバッファーを取得し、600 のムービー タイム スケールを使用する AVAssetWriter でバッファーを書き込むことです。また、設定できるメディア タイムスケールを指定する機会も与えられます。より長いムービーを記録できるように、より低い値に設定します (AVAssetWriterInput.h を参照)。

于 2013-10-25T08:18:27.350 に答える