web-dev-qa-db-ja.com

ポートスピーカーの不明な選択データソース(タイプ:スピーカー)?

catログにこのメッセージが複数回表示されます:

[avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Speaker (type: Speaker)

私はこのコードを使用してバックグラウンドミュージックを再生しています:

  let path = Bundle.main.path(forResource: fileName, ofType:"mp3")!
        let url = URL(fileURLWithPath: path)

        do {
                let sound = try AVAudioPlayer(contentsOf: url)
                self.player = sound
                sound.prepareToPlay()
                sound.volume = 0.05
                sound.numberOfLoops = loops
                sound.play()
        } catch {
            print("[PLAY SOUND][DELEGATE] error loading file -> \(fileName)")
        }

私は調査を行い、同様の問題を発見したので、viewdidloadにオーディオカテゴリを追加しました。

  do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault)
            try AVAudioSession.sharedInstance().setActive(true)
        } catch {
            print(error)
        }

上記のコードを追加した後、サイレントモードの電話でもバックグラウンドミュージックが再生されます。 Unknown selected data source for Port Speaker (type: Speaker)のデバッガメッセージはまだ表示されています

22
Jack

メッセージUnknown selected data source for Port SpeakerはiOS 12の問題のようです。コードが機能していても、何らかの警告が表示されるようです。おそらくAppleはすぐにこれを修正するので、今のところこの警告を無視して、解決策が見つかったらそれを黙らせることができるかもしれません。

ソース: iOS 12のAVAudioSessionエラー

サイレントモードで再生するバックグラウンドミュージックについては、AVAudioSessionCategoryを選択したためです。 AVAudioSessionCategoryPlaybackドキュメントによると( source ):

このカテゴリを使用する場合、アプリの音声はサイレントスイッチがサイレントに設定された状態で、または画面がロックされたときに続行されます。

アプリのスタイルによっては、AVAudioSessionCategorySoloAmbientを使用できます( source ):

オーディオは、画面のロックとサイレントスイッチ(iPhoneではRing/Silentスイッチと呼ばれます)によって無音になります。

または、おそらくAVAudioSessionCategoryAmbientsource ):

このカテゴリは、音楽アプリの再生中にユーザーが再生する仮想ピアノなど、「一緒に再生」スタイルのアプリにも適しています。このカテゴリを使用すると、他のアプリの音声が音声とミックスされます。オーディオは、画面のロックとサイレントスイッチ(iPhoneではRing/Silentスイッチと呼ばれます)によって無音になります。

20
Victor Sanchez

Swift 4.2から、当初は次のようにセットアップしました。

try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])

実際に録音機能は必要なかったので、変更しました

try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])

これによりエラーが解消されました(エラーを解消するために私ができる唯一のことでした)。ただし、録音機能も必要な場合は、明らかにこれは機能しません。

3
Adam S.