Androidなどに自分でオーディオコーデックをAudioRecord?
質問
私は現在、ループバックプログラムのための試験のオーディオAndroidデバイス
このAudioRecordとAudioTrack記録PCMオーディオからマイクプPCMオーディオを読み取る
こちらのコード:
public class Record extends Thread
{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority
(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize);
atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STREAM);
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
}
}
ときの創造にAudioTrackとAudioRecordのエンコーディングされており、AudioFormatこることができ16ビットまたは8ビットPCM。
私は自分のG711コーデックを実施、こういうことができるようにエンコード、オーディオからは、総務省およびデコードまにゅん エンコード(短lin[],int offset,byte enc[],intフレーム) や decode(byte enc[]、短lin[],intフレーム) 方法が不明などに使用してエンコードのデコード、オーディオからのAudioRecordとAudioTrack.
誰でもできるので助けてくれるのがポイントの方向になっていますか?
解決
あなたを変えてください arec.read(buffer, 0, buffersize)
使用するための呼び出し Bytebuffer
read()
からの方法 AudioRecord
.
バイトが入ったら ByteBuffer
オブジェクト、その後、G711実装コールのエンコードを挿入して使用できます。 ByteBuffer.asShortBuffer()
キャプチャされたPCMデータをエンコーダーに入れる方法。
それは、あなたのためにその仕事をするためにサードパーティのライブラリを導入することなく、あなたの最初の質問を解決するでしょう。 (この答えは、質問に出くわす将来の人々のためのものです)。
私の質問はなぜですか?
上記のコードでは、マイクからPCMデータをキャプチャし、再生のためにバッファーに直接書き込みます。
実装では、PCM-> G711(エンコード) - > G711(デコード) - > PCMのパスに従うことは意味がありません。あなたがしているのは、不必要な処理と遅延を導入することです。これで、エンコードされたデータを別のストーリーになる耳のピースを介して再生しようとする代わりに、ファイルにエンコードされたデータを書き込む場合は、現在のコードがPCMデータをエンコードするのに本当に役に立たないようです。
ここで独自のコーデックを導入することは、圧縮された音声データをファイルに書き込むというコンテキスト(たとえば、圧縮された方法でコールデータを録音する)やネットワークなどに送信するというコンテキストでのみ意味があります。
他のヒント
私はこのかわいらしい古います。できましたご自身のG711す。自分の初期思想いを利用するリチウムイオン電池(lib)の作成のためのカーネルの利用は、JNI呼び出します。