2016-08-29 23 views
2

iOSアプリケーションの一部としてSwiftにビデオレコーダーを実装しました。ビデオ出力のmaxRecordedDurationを4秒(30フレーム/秒)に設定しました:iOS - Swift - 録画が最大許容時間に達したときの音声数

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

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

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

両方

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

及びそれらが発生するイベントに応答する責任があるAVCaptureFileOutputRecordingDelegate、の一部であるとして

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

がトリガされますビデオファイルを記録するプロセス(アップルのドキュメンテーションに対応)。

ビデオ出力は、ユーザーシナリオ1では完全に機能しますが、ユーザーシナリオ2では、ビデオ出力にはいくつかのオーディオビットがありません。言い換えれば、ビデオの最後には、サウンドがない間もビデオはまだ再生されています。

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

Error Domain=AVFoundationErrorDomain Code=-11810 "Recording Stopped" UserInfo={AVErrorTimeKey=CMTime: {120/30 = 4.000}, AVErrorRecordingSuccessfullyFinishedKey=true, NSLocalizedDescription=Recording Stopped, NSLocalizedFailureReason=The recording reached the maximum allowable length., NSUnderlyingError=0x175324c0 {Error Domain=NSOSStatusErrorDomain Code=-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 
     } 
    } 

期待通りのコードが実行されるにもかかわらず、上述したように、ビデオの結果は最終的にいくつかの不足しているオーディオを持っています。私はこのバグを修正する方法があるのだろうかと思っていましたか?

答えて

1

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

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

+0

この問題は、遅延が正確ではなく、変わっていないことも間違いなくmaxrecordeddurationです。 8.5366666の代わりに8.0のように完全に停止させるための他の方法を知っていますか?タイマーさえも正確ではありません... – simplexity

+0

@simplexityはおそらく悪い考えですが、1秒前にタイマーを実行してから、0.01秒の遅延スクリプトを実行してstopRecording()を実行する必要があるかどうかを確認してください。何かがあれば、それはあなたが本当に望む時間に近づくはずです – budidino

+0

ありがとう。これは正しい方向に私を導いた。 – simplexity

関連する問題