AVAudioPlayerの出力をスピーカーに取得する方法
-
06-07-2019 - |
質問
AVAudioRecorderを使用してiPhoneでオーディオを録音するにはどうすればよいですか
その後、AVAudioPlayerを使用して記録を再生します。しかし、音はスピーカーではなく耳のスピーカーから出ています。サウンドをスピーカーにリダイレクトするにはどうすればいいですか?
TIA!
解決
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
他のヒント
この質問はかなり古いことはわかっていますが、同じ問題に苦労していたときに、レシーバースピーカーではなく、より大きなメディアスピーカーを使用したい人に役立つ簡単な解決策を見つけました。私が使用した方法は、AVAudioSessionCategoryOptionsのDefaultToSpeakerオプションでオーディオセッションをセットアップすることでした。
Swiftで(オーディオセッションの名前が session
であると仮定)-
session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker, error: nil)
Obj-Cで-
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
Swift 3
設定したサウンドを録音する前に:
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
そして再生前に設定します:
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
目的C
記録前:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error:nil];
再生前:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
これはSwift2で私に最適です
let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)
これは古い質問ですが、他の答えは私を助けませんでした...しかし、誰か(または将来の私!)がそれを必要とする場合に備えて、将来の参考のために投稿している解決策を見つけました。
解決策は次のブログ投稿で説明されています: iOS:Forceヘッドフォンを接続した状態でスピーカーに音声出力します。
プロジェクトで新しいObjective-CクラスAudioRouterを作成する必要があります。次に、オーディオ機能を開始するクラスのヘッダーファイルに AudioRouter.h
をインポートします。次に、対応する .m
ファイルで、 viewDidLoad
メソッド内に次の行を追加します。
AudioRouter *foobar = [[AudioRouter alloc] init];
[foobar initAudioSessionRouting];
[foobar forceOutputToBuiltInSpeakers];
これで、オーディオ(AVAudioPlayerなど)がスピーカーに出力されるようになりました!アプリの実行中に イヤホンを接続すると、すべての音声出力がイヤホンに送られることに注意してください。
Swift2:
try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker)
Swift 3
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
} catch let error as NSError {
print("Audio Session error: \(error.localizedDescription)")
}
Swift 4.0の回答
func SetSessionPlayerOn()
{
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
} catch _ {
}
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch _ {
}
do {
try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
} catch _ {
}
}
func SetSessionPlayerOff()
{
do {
try AVAudioSession.sharedInstance().setActive(false)
} catch _ {
}
}
これは、マイクではなくスピーカーで音声を出力するための重要な行です。記録中に設定しないでください
try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
以下は、記録をセットアップするための完全な機能です
private func setupRecorder() {
if isAudioRecordingGranted {
let session = AVAudioSession.sharedInstance()
do {
if #available(iOS 10.0, *) {
try! session.setCategory(.playAndRecord, mode:.spokenAudio)
}
else {
// Workaround until https://forums.swift.org/t/using-methods-marked-unavailable-in-swift-4-2/14949 isn't fixed
session.perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
}
try session.setActive(true)
try session.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 2,
AVEncoderAudioQualityKey:AVAudioQuality.high.rawValue
]
audioRecorder = try AVAudioRecorder(url: fileUrl(), settings: settings)
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
self.recorderState = .Ready
}
catch let error {
recorderState = .error(error)
}
}
else {
recorderState = .Failed("Don't have access to use your microphone.")
}
}