iOS アプリの一部として Swift にビデオ レコーダーを実装し、ビデオ出力の maxRecordedDuration を 4 秒 (30 フレーム/秒) に設定しました。
self.videoOutput?.maxRecordedDuration = CMTimeMakeWithSeconds( 4, 30 )
ユーザーが記録を開始すると、次の 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
}
}
コードは期待どおりに実行されますが、前述のように、ビデオの結果には最後に音声が欠落しています。このバグを修正する方法があるかどうか疑問に思っていましたか?