iOS 녹음 중지 후 오디오 재생 중지

5487 단어 react-native-audio

묘사

iPad Air 장치에서 녹음을 중지했을 때 다음과 같은 오류가 발생했습니다.ERROR: [0x16e247000] AVAudioSession.mm:692: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.그 후, 모든 재생된 오디오는 소리가 없었다.
내가 iOS 시뮬레이터에 있을 때 나는 아무런 문제가 없었다. 녹음은 예상대로 멈추었고 모든 것이 완벽한 것 같았다.
나는 녹화 전후에 즉시 React 오리지널 iOS WebView(Howler.js v2.0.0 사용)에서 음향 효과를 재생하기 때문에 이것이 문제의 일부일 수 있습니까?

토론 #1

토론 #2

더 많은 테스트를 했습니다.다음은 내가 지금까지 발견한 것이다.
이것은 매우 쓸모가 있다
- [_recordSession setActive:NO error:nil];AudioRecorderManager.m에 주석을 달아도 이 오류를 해결할 수 있지만, 녹화를 중지한 후 _recordSession AVAudioSession의 정지를 건너뛰는 것이 아니라 더 좋은 방법이 있어야 한다.
- 이 오류를 해결하기 위해 Howler.js을 제거합니다.하지만 난 홀러가 필요해.js는 이 프로젝트에 남고 싶어서 다른 방법을 생각해 봐야 합니다.
나는 왜 Howler.js이 문제의 일부인지 모르겠다. 왜냐하면 그것은 UIWebView에서 실행되는javascript 라이브러리이기 때문이다.울부짖는 자.js는 실행하는 브라우저/장치에 따라 HTML5 오디오나 오디오 웹 API를 이용해야 합니다.UIWebview는 표지 아래에 AVAudioSession을 어떤 방식으로 사용합니까?울부짖거나.js는 경쟁 조건을 공개하기 위해 추가 자원을 사용합니다.
이것은 도움이 되지 않는다
- withOptions:AVAudioSessionCategoryOptionMixWithOthers[_recordSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];에 추가하면 도움이 되지 않습니다.https://developer.apple.com/reference/avfoundation/avaudiosessioncategoryoptions/avaudiosessioncategoryoptionmixwithothers
- AudioRecorderManager.mwithOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation에 추가하면 도움이 되지 않습니다.https://developer.apple.com/reference/avfoundation/avaudiosessionsetactiveoptions/avaudiosessionsetactiveoptionnotifyothersondeactivation
- [_recordSession setActive:NO error:nil];AudioRecorderManager.m 오디오가 동시에 재생되지 않도록 지연 시간을 늘렸습니다.이거 소용없어.
- Howler.js에서 AudioRecorder까지의 오디오를 허용하는 것은 도움이 되지 않습니다.https://github.com/goldfire/howler.js/#global- 옵션
- Howler.js에 HTML5 플레이어를 사용하여 오디오 웹 API 대신 오디오를 재생하도록 강요하는 것은 도움이 되지 않습니다.autoSuspend 문제의 일부는 Howler.js

토론 #셋

을 만들 때 AudioRecorderManager.m을 설정하지 않았기 때문에 세션의 기본값은 sessionCategory이지 _audioPlayer이나 AVAudioSessionCategorySoloAmbient을 사용하는 것이 아니다.
녹음 관리원.m
_audioPlayer = [[AVAudioPlayer alloc]
  initWithContentsOfURL:_audioRecorder.url
  error:&error];
업데이트: 오디오 플레이어 세션을 AVAudioSessionCategoryPlayAndRecord 세션 범주로 설정합니다.옵션 AVAudioSessionCategoryPlayback을 사용하여 두 개의 세션을 생성했습니다.이거 소용없어.AVAudioSessionCategoryPlayback을 봤는데 무슨 원인인지 모르겠어요.나는 지금 이 플러그인을 사용하지 않고, 사용할 시간도 많지 않다.android 지원을 발표하는 데 중점을 두고 다시 이 문제로 돌아가고 싶습니다.만약 당신이 해결 방법을 찾을 수 있다면, 동시에 나에게 알려주세요!withOptions:AVAudioSessionCategoryOptionMixWithOthers 성공!
이것은 매우 나쁘지만, 세션 정지와 정지 사이의 지연을 늘리면 문제를 해결할 수 있다.
원본 코드, 작동하지 않음
RCT_EXPORT_METHOD(stopRecording)
{
  [_audioRecorder stop];
  [_recordSession setActive:NO error:nil];
  _prevProgressUpdateTime = nil;
}
새 지연 코드, 작동합니다!
RCT_EXPORT_METHOD(stopRecording)
{
    [_audioRecorder stop];
    _prevProgressUpdateTime = nil;
    [self performSelector:@selector(stopSession) withObject:nil afterDelay:1000];
}

-(void)stopSession
{
  [_recordSession setActive:NO error:nil];
}

토론 #4

은 비동기적으로 발생한 것 같다.

토론 #5

이 완료되기 전에 오디오 세션을 비활성화하면 속도가 느린 장치에서 경쟁 조건 문제가 발생할 수 있습니다.
나는 stop 사건 후에 오디오 세션을 정지하려고 했는데, 이렇게 하면 우리가 심각한 지연을 사용할 필요가 없다.그러나 stop사건이 터진 후에도 녹음기 audioRecorderDidFinishRecording은 여전히 그 일을 하고 있는 것 같다.
이 가능하다, ~할 수 있다,...불행히도 개발자 문서는 이 방면에 큰 도움이 되지 않았다.
우리는 최종적으로 지연을 없애기 위해 애플에 버그를 제출해야 할지도 모른다.stop 이런 상황이 아직도 발생하고 있습니까?audioRecorderDidFinishRecording 저도 같은 질문이 있습니다.녹화를 멈춘 후, 나는 모든 미디어 파일 (동영상과 오디오) 을 재생할 수 없습니다.

토론 #6

@benlinton. 만약 당신이 이 점을 여전히 보고 있다면, 당신은 이 변경 사항으로 홍보를 제출할 수 있습니까?이상적인 상황에서 지연은 설정할 수 있다.

토론 #7

내 생각에는 그렇지만, 나는 이미 몇 달 동안 이 도서관과 합작하지 않았기 때문에, 나는 확정할 수 없다.

토론 #8

이 채팅 앱

토론 #9

을 개발할 때 이 문제에 부딪혔습니다. 저도 같은 문제가 있습니다.나는 로컬 오디오와 react-native-sound 로컬 코드를 읽었다.검색:
  • react native audio가 녹화를 중지할 때 파일

    토론 #10

  • 에서

    토론 #11

    을 비활성으로 설정합니다.
    RCT_EXPORT_METHOD(stopRecording)
    {
      [_audioRecorder stop];
      [_recordSession setActive:NO error:nil];
      _prevProgressUpdateTime = nil;
    }
    
  • react-native-sound을 사용하여 오디오 파일을 재생합니다.그것은 AVAudioSession이 활성화 상태로 설정되지 않은 것과 같다.
  • 그래서 제 자바스크립트 파일에 이 코드를 추가한 후에요.효과가 나타나고 있습니다.
    if (Platform.OS == 'ios') {SoundPlayer.enable(true);}    // <---- this line
    this.soundPlayer = new Sound(filename, SoundPlayer.DOCUMENT, (error) => {
      ...
    }
    
    도움이 되었으면 좋겠습니다.AudioRecorderManager.m@Hermit Carb 이것은 저에게 매우 효과적입니다. 감사합니다. AVAudioSession은 이 문제가 이미 해결된 것 같아서 끝났습니다.

    좋은 웹페이지 즐겨찾기