2017-06-08 29 views
2

私のアプリには音声読み上げ機能があります。&ボタンを押してください。ビューコントロールは、ウィンドウの外側からビューにアニメーション化され、録画が開始され、ボタンを放します。録画が停止し、ウィンドウの境界からアニメーションが再生されます。iOS Speech-to-Text AVAudioInputNode(?)ランダムクラッシュ

突然、Firebaseを使っていくつかのcrashreportを取得しています。その機能が一部のユーザー(2人のユーザー/ 5人のインスタンス、すべて同じ事件)でクラッシュしています。以下は、私のcrashlog-eventsが私に指し示すコードです。しかし、私は単純にエラーを再現することはできません、私はおそらく1000回試してみました、ストレス負荷(猿のボタンマッシュなど)、それは私のデバイスでクラッシュしません..

誰でも助けることができます私は下のstacktrace /アドバイスを解剖? /何がうまくいかないのかについての示唆を持っていますか?私は安定化するために何ができますか?

私の理解によれば、それはinstallTapOnBus:0の周りを回っていますか?次のステップの提案はありますか?

_audioEngine = [[AVAudioEngine alloc] init]; 
_speechRecognizer = [[SFSpeechRecognizer alloc] initWithLocale:[NSLocale localeWithLocaleIdentifier:@"da"]]; 
[_speechRecognizer setDelegate:self]; 
_request = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; 


AVAudioInputNode *node =[_audioEngine inputNode]; 
AVAudioFormat *recordingFormat = [node outputFormatForBus:0]; 


[node installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { 

     [_request appendAudioPCMBuffer:buffer]; 

    }]; 
} 

のStackTrace:

1 CoreFoundation __exceptionPreprocess + 1232864 

2 libobjc.A.dylib objc_exception_throw + 34100 

3 CoreFoundation +[NSException raise:format:arguments:] + 1232560 

4 AVFAudio AVAE_RaiseException(NSString*, ...) + 78280 

5 AVFAudio AVAudioNodeImplBase::CreateRecordingTap(unsigned long, unsigned int, AVAudioFormat*, void (AVAudioPCMBuffer*, AVAudioTime*) block_pointer) + 554488 

6 AVFAudio -[AVAudioNode installTapOnBus:bufferSize:format:block:] + 545144 

7 shoppinglist 4295363296 + 297696 

8 shoppinglist 4295358408 + 292808 

9 UIKit -[UIViewController loadViewIfRequired] + 65212 

10 UIKit -[UIViewController view] + 64152 

11 shoppinglist 4295296168 + 230568 

12 shoppinglist 4295272504 + 206904 

13 shoppinglist 4295266368 + 200768 

14 UIKit -[UIViewController _setViewAppearState:isAnimating:] + 162800 

15 UIKit -[UIViewController __viewWillAppear:] + 162144 

16 UIKit __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 3540196 

17 UIKit _runAfterCACommitDeferredBlocks + 2738508 

18 UIKit _cleanUpAfterCAFlushAndRunDeferredBlocks + 2681320 

19 UIKit _afterCACommitHandler + 9796 

20 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 895396 

21 CoreFoundation __CFRunLoopDoObservers + 886316 

22 CoreFoundation __CFRunLoopRun + 887416 

23 CoreFoundation CFRunLoopRunSpecific + 36256 

24 GraphicsServices GSEventRunModal + 49264 

25 UIKit UIApplicationMain + 479316 

26 shoppinglist 4295262124 + 196524 

27 libdyld.dylib start + 17816 
+0

クラッシュの例外はありますか? –

+0

'-installTapOnBus:...'のコードを貼り付けることもできますか? –

+0

リストされたstacktraceは、FirebaseのCrashreportingから取得したものです。EXC_SOFTWARE/UNCAUGHT_NS_EXCEPTIONと表示されていますか? -installTapOnBus:...は、フレームワーク内のAVAudioNode.hの一部です。\t AVFoundation(私の機能ではありません):-S – PeterAntonsen

答えて

1

は私も同じクラッシュがあったが、今では固定されます。したがって、オーディオフォーマットのレートを確認する必要があります:

AVAudioInputNode *node =[_audioEngine inputNode]; 
AVAudioFormat *recordingFormat = [node outputFormatForBus:0]; 

if (recordingFormat.sampleRate > 0) 
{ 
    [node installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { 

     [_request appendAudioPCMBuffer:buffer]; 

    }]; 
} 
+0

提案のためのThx!私はそれを実際のテスト方法がないのに答えとして受け入れるでしょう:-S 私は、ユーザーが彼の声をまだ記録できる適切な状態でノードを回復することを望む次のコードを挿入しました。 'if(recordingFormat.sampleRate <= 0){ [self.audioEngine.inputNode reset]; recordingFormat = [[self.audioEngine inputNode] outputFormatForBus:0]; } ' – PeterAntonsen

+0

テストのために以下のシナリオを試してみてください:スカイプまたは音声で誰かに電話をかけ、会話を開いたままにしておきます。その後、あなたのアプリを開き、声を録音しようとします。 –

関連する問題