###前提・実現したいこと
現在、androidで音声をリアルタイムで再生するというアプリを作成し、RN-52というbluetoothモジュールを使用して、スピーカーに飛ばし、、ワイヤレスのスピーカーの作成を目指しています。
プログラムの実行は成功し、ワイヤレスでの拡声器は完成したのですが、音の遅延がひどかったため、改善しようとし、調べたところ、apt-Xというコーデックに変更できれば遅延は改善されるということだったのですが、使用中のnexus5RN-52、の型番では、apt-Xに対応していませんでした。なので、プログラムをいじれば改善できないかと思ったのですが、やり方の見当がつきません。どなたか、アドバイスいただければ幸いです。プログラム以外での改善方法などもあれば、おねがいします。
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
java
package com.example.audioplayer;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder.AudioSource;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
AudioRecord audioRec = null;
Button btn = null;
boolean bIsRecording = false;
int bufSize ;
int samplingRate ;
private AudioTrack audioTrack;
private void recodingAndPlay() { if (bIsRecording) { bIsRecording = false; } else { // 録音開始 Log.v("AudioRecord", "startRecording"); audioRec.startRecording(); bIsRecording = true; // 録音スレッド new Thread(new Runnable() { @Override public void run() { byte buf[] = new byte[bufSize]; // TODO Auto-generated method stub while (bIsRecording) { // 録音データ読み込み audioRec.read(buf, 0, buf.length); audioTrack.write(buf, 0, buf.length); // Log.v("AudioRecord", "read " + buf.length + // " bytes"); } // 録音停止 Log.v("AudioRecord", "stop"); audioRec.stop(); } }).start(); } } private static int[] mSampleRates = new int[] { 8000, 11025, 16000, 22050, 44100 }; public AudioRecord findAudioRecord() { for (int rate : mSampleRates) { for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_8BIT }) { for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO }) { try { Log.d("TAG", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig); int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); if (bufferSize != AudioRecord.ERROR_BAD_VALUE) { // check if we can instantiate and have a success AudioRecord recorder = new AudioRecord( AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize); if (recorder.getState() == AudioRecord.STATE_INITIALIZED) bufSize = bufferSize; samplingRate = rate; return recorder; } } catch (Exception e) { Log.e("TAG", rate + "Exception, keep trying.", e); } } } } return null; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // AudioRecordの作成 audioRec = findAudioRecord(); audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, samplingRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM); audioTrack.play(); findViewById(R.id.button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { recodingAndPlay(); } }); }
}
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/29 07:36
2017/10/01 05:28