2017-07-11 28 views
0

私はこのexampleに基づいて自分のコードのMFCC抽出部分を作成しました。これは2つのAudioProcessorインスタンスを作成しました。しかし、Androidスタジオでデバッガを使用して、私はコードがすぐにprocessingFinished関数に入り、両方の処理関数をスキップしていることがわかりました。インスタンス内のmfcc変数は、2番目のAudioProcessor関数のprocessingFinished関数中にnullのままになりました。なぜデータは決して処理されませんか?これはMFCCを取得する正しい方法ですか?TarsosDSPを使用してファイルからMFCCデータを抽出するにはどうすればよいですか?

私のソースコード:(私はファイルからパイプにtheAudioDispatcherを変更)

private void onMFCC() { 

    int sampleRate = 44100; 
    int bufferSize = 1024; 
    int bufferOverlap = 128; 
    //final AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,512); 
    String path = getExternalCacheDir().getAbsolutePath() + "/saytest.mp4"; 
    new AndroidFFMPEGLocator(this); 
    final AudioDispatcher dispatcher = AudioDispatcherFactory.fromPipe(path, sampleRate, bufferSize, bufferOverlap); 
    final MFCC mfcc = new MFCC(bufferSize, sampleRate, 40, 50, 300, 3000); 

    dispatcher.addAudioProcessor(mfcc); 
    dispatcher.addAudioProcessor(new AudioProcessor() { 

     @Override 
     public void processingFinished() { 

      //vvv error b/c mfcc instance variable is null 
      //float[] mfccArr = mfcc.getMFCC(); 
      System.out.println("DONE"); 
     } 

     @Override 
     public boolean process(AudioEvent audioEvent) { 
      // breakpoint or logging to console doesn't enter function 
      return true; 
     } 
    }); 
    dispatcher.run(); 

} 

があるため、パイプAudioDispatcherの誤差はこれをしなければならなかったという可能性がありますか?

Starting piped decoding process for /storage/emulated/0/Android/data/com.example.audiorecorder/cache/saytest.mp4 
I/PipeDecoder: with command: "/data/user/0/com.example.audiorecorder/cache/ffmpeg" -ss 0.0 -i "/storage/emulated/0/Android/data/com.example.audiorecorder/cache/saytest.mp4" -vn -ar 44100 -ac 1 -sample_fmt s16 -f s16le pipe:1 
I/PipeDecoder: CANNOT LINK EXECUTABLE "/data/user/0/com.example.audiorecorder/cache/ffmpeg": /data/data/com.example.audiorecorder/cache/ffmpeg: has text relocations 
I/PipeDecoder: Aborted 
I/PipeDecoder: Finished piped decoding process 

助けてください。どうもありがとうございます!

EDIT: 私は、メソッドの最後に次の行を追加することにより、独立したプロセス関数を呼び出してみました:

mfcc.process(new AudioEvent(new TarsosDSPAudioFormat(sampleRate, bufferSize, 1, true, true))); 

はしかし、これは私にはNullPointerExceptionを与えました。

  • また、2つの異なるオーディオファイルを使用してmfccインスタンスを比較しましたが、データが完全に同じであることがわかりました。処理の結果はありませんでした。ディスパッチャをマイクに戻したとき、mfccには値があり、プログラムはプロセス関数を実行しました!ディスパッチャがオーディオファイルにアクセスするのはなぜですか?

答えて

0

私はディスパッチャfromPipeが働いていなかったことに気づいたので、私はこの問題を修正したので、私は、ディスパッチャを置き換える:

InputStream inStream = new FileInputStream(path); 
AudioDispatcher dispatcher = new AudioDispatcher(new UniversalAudioInputStream(inStream, new TarsosDSPAudioFormat(sampleRate, bufferSize, 1, true, true)), bufferSize, bufferOverlap); 
関連する問題