스피커에 avaudioplayer 출력을 얻는 방법
-
06-07-2019 - |
문제
나는 AvaudioreCorder에서 오디오를 녹음하고 있습니다 avaudiorecorder를 사용하여 iPhone에서 오디오를 어떻게 녹화합니까?
그런 다음 avaudioplayer를 사용하여 녹음을 재생합니다. 그러나 소리는 큰 스피커가 아니라 귀 스피커에서 나옵니다. 소리를 시끄러운 스피커로 어떻게 리디렉션할까요?
티아!
해결책
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];
스위프트 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 : 헤드폰을 연결하는 동안 오디오 출력을 스피커에 강제로 출력합니다. .
프로젝트에서 새로운 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)
스위프트 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 _ {
}
}
이것은 마이크에서 스피커에서 Auido를 출력하는 핵심 라인입니다. 기록하는 동안 설정해야합니다
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.")
}
}