XCode 6でアプリをテストしていますが、iOS8でAVAudioSessionの問題を見つけました。
私が電話するとき
[[AVAudioSession sharedInstance] setActive:NO error:nil];
次のエラーメッセージが表示されます。
AVAudioSession.mm:623:-[AVAudioSession setActive:withOptions:error:]:I/Oを実行しているオーディオセッションを非アクティブ化します。オーディオセッションを非アクティブ化する前に、すべてのI/Oを停止または一時停止する必要があります。
AVAudioSession.hでは、
このメソッドは、I/Oの実行中または一時停止中にセッションが非アクティブに設定されると、iOS 8以降にリンクされたアプリで例外をスローします(オーディオキュー、プレーヤー、レコーダー、コンバーター、リモートI/Oなど) 。
しかし、I/Oが実行されているかどうかを確認する方法と、オーディオセッションをリセットする必要があるときにすべてを破棄する方法はわかりません。
この問題を解決し、AVAudioPlayerDelegateのメソッドにこのコードを挿入しました。
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
[audioPlayer stop];
[audioPlayer prepareToPlay];
}
audioPlayerは、クラスのヘッダーで宣言された変数です。
prepareToPlayの指示で問題が解決するはずです!
注意してください。ムービーを再生している場合(音がなく、オーディオトラックが削除されている場合でも)、I/Oスレッドが作成され、常に上記のエラーがスローされます。
AVAudioEngineとAVAudioPlayerNodeを使用してサウンドを再生しています。私も同じ問題に直面しています。私の環境はiOS 10です。
AVAudioSession.sharedInstance()
を使用してAVAudioSessionを処理します。シミュレーターでアプリを実行するときはすべて問題ありませんが、自分のデバイスに切り替えるときは問題ありません。失敗しました。
同じセッションを使用して録音と再生を処理していると思います。そのため、奇妙な問題が発生する可能性があります。私の場合、サウンドを録音し、1秒遅れて再生します。したがって、stopRecordingAudio()
を使用する場合、次のコードを追加します。
if audioEngine.running {
audioEngine = AVAudioEngine() // var audioEngine = AVAudioEngine()
try! AVAudioSession.sharedInstance().setActive(false)
}
AudioEngineを再定義した後、audioEngineは強制的に停止され、セッションが解放されました。クラッシュは二度と起こりません。
このメッセージがお役に立てば幸いです。
AVAudioSessionの前にAVplayerを設定しましたsetActive NO;
[self.audioPlayer pause]; [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
Swift 5、IOS 12
私はAVPlayerを使用しますが、prepareToPlayメソッドはありません。したがって、Alessio Campanelliの answer は私の問題を解決しません。しかし、私は次のことに気づきました
player.pause()
print("currentTime:", player.currentTime().seconds) //currentTime: 4.258164744
print("status:", player.status.rawValue) //status: 1 (readyToPlay)
print("timeControlStatus:", player.timeControlStatus.rawValue) //timeControlStatus: 0 (paused)
print("rate:", player.rate) //rate: 0.0
sleep(1)
print("currentTime:", player.currentTime().seconds) //currentTime: 4.261325767
print("status:", player.status.rawValue) //status: 1 (readyToPlay)
print("timeControlStatus:", player.timeControlStatus.rawValue) //timeControlStatus: 0 (paused)
print("rate:", player.rate) //rate: 0.0
pauseメソッドを呼び出した後、プレーヤーはしばらくの間オーディオファイルを再生します。他のプロパティは、それが一時停止していると言いますが。だから私が見つけた唯一の解決策は
player.pause()
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
do {
try AVAudioSession.sharedInstance().setActive(false)
} catch let error {
print(error)
}
}
実際、0.1秒でも十分です。これは悪い方法ですが、もっと良いものを見つけることができませんでした。プレーヤーがオーディオファイルの再生を停止したときを確認する方法を誰かが知っている場合は、お知らせください。