2017-03-22 6 views
22

ビデオ録画アプリケーション。バックグラウンドミュージックを停止/一時停止せずに(ユーザーがApple Musicを聴いているときなど)、これを動作させたい。これは、カテゴリーをmixWithOthersAVAudioSessionシングルトンに設定するときれいにできます。AVCaptureDeviceInputをCaptureSessionリセット/リフォーカスビデオに追加する

カテゴリを設定した後、AVCaptureDeviceInputAVCaptureSessionを追加する必要があります(音声が録音されるようになります)。この結果、バックグラウンド・オーディオやビデオのリセット/再フォーカスに対する不具合が発生します。

私は調査しましたが、バックグラウンドのオーディオグリッチは避けられないものですが、入力が追加されるとビデオ自体はリセットされません。ビデオリセットの結果、記録されたビデオの最初のフレームは黒/黒のいずれかであるか、またはピントが合っていないフレームから開始してからピントを合わせます。

Snapchat iosアプリもチェックされていますが、録画を開始すると音声の不具合が発生しますが、動画はスムーズに録画されます。私は間違って何をしています。

マイコード:

//Setting audio session to mixWithOthers upon startup 
let session = AVAudioSession.sharedInstance() 

do { 
    try session.setCategory(AVAudioSessionCategoryPlayAndRecord, 
          with: [.mixWithOthers]) 
    if session.mode != AVAudioSessionModeVideoRecording { 
     try session.setMode(AVAudioSessionModeVideoRecording) 
    } 
} catch let error { 
    print("avsession category error: \(error)") 
} 

そして:

//Just before recording starts will add audio input 
let audioDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeAudio) 
do 
{ 
    let deviceInput = try AVCaptureDeviceInput(device: audioDevice) as AVCaptureDeviceInput 
    if captureSession.canAddInput(deviceInput) { 
     captureSession.addInput(deviceInput) 
    } 
    else { 
     print("Could not add audio device input to the session") 
    } 


} 
catch let error as NSError { 
    print(error.localizedDescription) 
    return 
} 

すべてで任意のグリッチなしでこれを実行することは可能でしょうか? もしそうでなければ、どうすればSnapchat(addInput呼び出し時にビデオリセットなし)のようにすることができますか?

+0

ない、それはSOで外部ファイルを共有しても大丈夫ですかどうかわからが、私はこののクリーンなサンプルプロジェクトをアップロードしました: https://www.dropbox.com/s/1x7bl4fkboxu9cf/VideoInputGlitch.zip?dl = 0 –

+0

AVCaptureDeviceのプロパティは.focusがあなたのケースではおそらくautoFocusに設定されていますので、lockedに設定してみてください。 –

+0

CameraEngine.swiftファイルとVideoWriter.swiftファイルがプロジェクトにありません。 – DisableR

答えて

-1

だからあなたの質問から、特にこの文:

ビデオリセットの結果は、記録した映像の最初のフレームは黒/暗であるか、またはそれがフォーカス枠の外で始まり、その後、焦点を当てていることです。

私にはビデオ録画を開始した後にaudioInputを追加しています。ビデオの録画を開始する前にデバイスを追加することは可能ですか? AVCaptureSessionは本質的にちょうど入力と出力を必要とするため、別の入力ソースを追加するときにビデオが "フリーズ"することが予想されます。私は、録画の前にaudioInputデバイスを追加すると、最終的な製品でその問題が解決されると思います。 :)

だっ言及されたもう一つのコメント:

あなたは入力を変更する前に、セッションでbeginConfiguration/commitConfigurationを呼び出していますか?

- 午後3時30分

でSeanLintern88 4月10日私は、これは質問の作者によって対処されなかったと思うし、また、問題の原因である可能性があります。 this question/answerに示すように、begin/commit configurationコールの間にaudioInputデバイスを追加する必要があります。

一般的に、私はコアApple docsが非常に役に立ち、おそらくもっとやりたいことについてもっと多くの情報を持っていることがわかります。

0

ユーザーがサイレントスイッチ(またはiPhoneの着信/サイレントスイッチ)を移動すると、私は「サイレント」にAVAudioSession AVAudioSessionCategory(Solo)Ambientカテゴリ

Category        Silenced Interrupts 
AVAudioSessionCategoryAmbient   Yes  No 
AVAudioSessionCategorySoloAmbient  Yes  Yes 
AVAudioSessionCategoryMultiRoute  No   Yes 
AVAudioSessionCategoryPlayAndRecord No   Yes 
AVAudioSessionCategoryPlayback  No   Yes 
AVAudioSessionCategoryRecord   No   Yes 

https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html

によって設定されたAVCaptureSession addInputリセットの沈黙を気づきましたあなたの音声は消音されます。

AVAudioSessionCategoryAmbient - 再生のみ。磨きや興味を追加するが、アプリの使用に不可欠ではないサウンドを再生します。このカテゴリを使用すると、リング/サイレントスイッチと画面ロック時に音声が消えます。

AVAudioSessionCategorySoloAmbient - (デフォルト)再生のみ。ユーザーがRing/Silentスイッチを「サイレント」の位置に切り替えたときと、画面がロックしたときの音声を消音します。このカテゴリは、AVAudioSessionCategoryAmbientカテゴリとは異なり、他のオーディオを中断します。

関連する問題