2017-04-01 26 views
0

私は、次のコードを持っている:AudioTrackを増幅するには?

public class MainActivity extends Activity { 
    private int freq = 8000; 
    private AudioRecord audioRecord = null; 
    private Thread Rthread = null; 

    int PERMISSION_ALL = 1; 
    String[] PERMISSIONS = {Manifest.permission.RECORD_AUDIO}; 

    private AudioTrack audioTrack = null; 
    byte[] buffer = new byte[freq]; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if(!hasPermissions(this, PERMISSIONS)){ 
      ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); 
     } 

     android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
     final int bufferSize = AudioRecord.getMinBufferSize(freq, 
       AudioFormat.CHANNEL_CONFIGURATION_MONO, 
       AudioFormat.ENCODING_PCM_16BIT); 


     audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, freq, 
       AudioFormat.CHANNEL_CONFIGURATION_MONO, 
       MediaRecorder.AudioEncoder.AMR_NB, bufferSize); 

     audioTrack = new AudioTrack(AudioManager.ROUTE_HEADSET, freq, 
       AudioFormat.CHANNEL_CONFIGURATION_MONO, 
       MediaRecorder.AudioEncoder.AMR_NB, bufferSize, 
       AudioTrack.MODE_STREAM); 

     LoudnessEnhancer enhancer = new LoudnessEnhancer(audioTrack.getAudioSessionId()); 

     enhancer.setTargetGain(100); 
     enhancer.setEnabled(true); 


     audioTrack.setPlaybackRate(freq); 
     buffer = new byte[bufferSize]; 
     audioRecord.startRecording(); 
     Log.i("info", "Audio Recording started"); 
     audioTrack.play(); 
     Log.i("info", "Audio Playing started"); 
     Rthread = new Thread(new Runnable() { 
      public void run() { 
       while (true) { 
        try { 
         audioRecord.read(buffer, 0, bufferSize); 
         audioTrack.write(buffer, 0, buffer.length); 

        } catch (Throwable t) { 
         Log.e("Error", "Read write failed"); 
         t.printStackTrace(); 
        } 
       } 
      } 
     }); 
     Rthread.start(); 
    } 

    public static boolean hasPermissions(Context context, String... permissions) { 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
      for (String permission : permissions) { 
       if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 
} 

このコードでは、マイクからの入力を読んで、スピーカー/ヘッドフォン接続でそれを再生することができます。ここまでは順調ですね。今、私は入力の音量を増幅する必要があります。私はhere提案されたソリューションを試しましたが、私は本当に歪んだオーディオを取得してしまいます。私もLoudnessEnhancerを試しましたが、効果がないようです。

+0

enoughtサンプルコードあなたに... 1.6、などを試していない場合は、オーディオが...と言う... 1.2ちょうどカーブ...あなただけのいくつかの要因によって、曲線上の各点を掛ける音量を大きくすることです彼はあなたのオーディオのためにあまりにも多くの可能性があります2の係数を使用して参照してください...このストレッチは、ビット深度で定義されているように最大と最小の許容値にチェックし、クリップする必要があります...あなたのコードではないあなたがこのポイントの乗算をしているところを示しています...ビット深度が16の場合、2バイトのデータを取り出して新しいポイントをカットします。各バイトを別々に掛けないようにしてください。また、エンディアンにも注意してください –

+0

素早く応答してくれてありがとう!おそらく、ここで使う歪みは間違った言葉でした。私が意味していたのは、再生中にオーディオが途切れてしまうことでした。それは連続ストリームとして再生されません。また、私はオーディオのかなりの増幅が必要です。今、私は健全なエンジニアではなく、低レベルのものでは非常に悪いので、コードサンプルは非常に高く評価されます。 –

答えて

0

さて、ラウドネスエンハンサーが機能するようになりました。私はそれがそこに大きな利得価値であることを知っていますが、私はこれに多くの利益を必要とします。同様の問題を抱えている可能性がある他の人のための更新されたコードです。

public class MainActivity extends Activity { 
    private int freq = 8000; 
    private AudioRecord audioRecord = null; 
    private Thread Rthread = null; 

    int PERMISSION_ALL = 1; 
    String[] PERMISSIONS = {Manifest.permission.RECORD_AUDIO}; 

    private AudioTrack audioTrack = null; 
    byte[] buffer = new byte[freq]; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if(!hasPermissions(this, PERMISSIONS)){ 
      ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); 
     } 

     android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
     final int bufferSize = AudioRecord.getMinBufferSize(freq, 
       AudioFormat.CHANNEL_CONFIGURATION_MONO, 
       AudioFormat.ENCODING_PCM_16BIT); 


     audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, freq, 
       AudioFormat.CHANNEL_CONFIGURATION_MONO, 
       MediaRecorder.AudioEncoder.AMR_NB, bufferSize); 

     audioTrack = new AudioTrack(AudioManager.ROUTE_HEADSET, freq, 
       AudioFormat.CHANNEL_CONFIGURATION_MONO, 
       MediaRecorder.AudioEncoder.AMR_NB, bufferSize, 
       AudioTrack.MODE_STREAM); 

     LoudnessEnhancer enhancer = new LoudnessEnhancer(audioTrack.getAudioSessionId()); 
     NoiseSuppressor.create(audioTrack.getAudioSessionId()); 
     AcousticEchoCanceler.create(audioTrack.getAudioSessionId()); 

     enhancer.setTargetGain(10000); 
     enhancer.setEnabled(true); 


     audioTrack.setPlaybackRate(freq); 
     buffer = new byte[bufferSize]; 
     audioRecord.startRecording(); 
     Log.i("info", "Audio Recording started"); 
     audioTrack.play(); 
     Log.i("info", "Audio Playing started"); 
     Rthread = new Thread(new Runnable() { 
      public void run() { 
       while (true) { 
        try { 
         audioRecord.read(buffer, 0, bufferSize); 
         audioTrack.write(buffer, 0, buffer.length); 

        } catch (Throwable t) { 
         Log.e("Error", "Read write failed"); 
         t.printStackTrace(); 
        } 
       } 
      } 
     }); 
     Rthread.start(); 
    } 

    public static boolean hasPermissions(Context context, String... permissions) { 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
      for (String permission : permissions) { 
       if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 
} 
関連する問題