3

iOS アプリの一部として Swift にビデオ レコーダーを実装し、ビデオ出力の maxRecordedDuration を 4 秒 (30 フレーム/秒) に設定しました。

self.videoOutput?.maxRecordedDuration = CMTimeMakeWithSeconds( 4, 30 )

ユーザーが記録を開始すると、次の 2 つのシナリオが発生する可能性があります。

  1. ユーザーは、最大記録時間に達する前に記録を停止することを決定します。
  2. ユーザーがビデオ録画を停止する前に、最大録画時間に達しました。

どちらの場合も

func captureOutput( captureOutput: AVCaptureFileOutput!, didStartRecordingToOutputFileAtURL fileURL: NSURL!, fromConnections connections: [AnyObject]! )

func captureOutput( captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError! )

これらは の一部であるため、トリガーされますAVCaptureFileOutputRecordingDelegate。これは、ビデオ ファイルの記録プロセスで発生するイベントへの応答を担当します (Apple のドキュメントに対応)。

ビデオ出力は、ユーザー シナリオ 1 では完全に問題なく動作します。ただし、ユーザー シナリオ 2 では、ビデオ出力にいくつかのオーディオ ビットが欠落しています。つまり、ビデオの最後では、音声がなくてもビデオは再生され続けます。

func captureOutput( captureOutput: AVCaptureFileOutput!, didFinishRecordingToOutputFileAtURL outputFileURL: NSURL!, fromConnections connections: [AnyObject]!, error: NSError! )最大記録時間に達すると、次のエラーがスローされることを認識しています。

エラー Domain=AVFoundationErrorDomain Code=-11810 "Recording Stopped" UserInfo={AVErrorTimeKey=CMTime: {120/30 = 4.000}, AVErrorRecordingSuccessfullyFinishedKey=true, NSLocalizedDescription=Recording Stopped, NSLocalizedFailureReason=録音が最大許容長に達しました., NSUnderlyingError=0x175324c0 {エラー ドメイン=NSOSStatusErrorDomain コード=-16413 "(null)"}}

メソッドの先頭にコードを追加して、エラーがスローされたときに記録が正常に終了したかどうかを確認しました。

    // Error during video recording
    if let error = error, let finishedSuccessful = error.userInfo[ AVFoundation.AVErrorRecordingSuccessfullyFinishedKey ] as? Bool
    {
        // Video was not successfully recorded
        if !finishedSuccessful
        {
            return
        }
    }

コードは期待どおりに実行されますが、前述のように、ビデオの結果には最後に音声が欠落しています。このバグを修正する方法があるかどうか疑問に思っていましたか?

4

1 に答える 1

1

バグを修正するかどうかはわかりませんが、回避する方法があります。この機能を無視してmaxRecordedDuration、独自のカウントダウン タイマーを作成します。そうすれば、シナリオ 1 が唯一の可能なシナリオであることを確認できます。

それを達成する方法は複数あります。stopRecording()非常に単純なものは、記録が開始された瞬間から X 秒の遅延で実行することができます。

于 2016-12-24T03:32:48.173 に答える