Android sınıfı AudioRecord - canlı mikrofon ses hızlı işlem, ayarlanmış geri arama fonksiyonu
Mikrofon ses kaydı ve erişim oynatma neredeyse gerçek zamanlı olarak istiyorum. Bazı mikrofon ses kaydı ve hızlı erişim için Android AudioRecord sınıfını kullanmak için nasıl emin oldum.
İçin AudioRecord sınıf, resmi sitesi diyor ki 'uygulaması anketler AudioRecord nesne zaman' ve 'boyutu tampon olmak dolu belirler zaman uzunluğu kaydetmeden önce üzerinde çalışan okunmamış veri'. Daha sonra daha büyük bir arabellek yoklama daha sık kullanılmasını önerdi. Aslında hiç kod örnek göster.
Bir kitapta görmüştüm bir örnek AudioRecord sınıfı sürekli bir tampon taze canlı mikrofon ses ile doldurulur okumak için kullanır ve sonra da uygulamayı SD dosyasına bu verileri yazar. Pseudo-kod bir şey gibi görünüyor
set up AudioRecord object with buffer size and recording format info
set up a file and an output stream
myAudioRecord.startRecording();
while(isRecording)
{
// myBuffer is being filled with fresh audio
read audio data into myBuffer
send contents of myBuffer to SD file
}
myAudioRecord.stop();
Nasıl bu eşitler kayıt oranı ile okuma belirsizdir - boolean "" ve başka bir yerde düzgün sıralı kapalı? isRecording kod Bu kod ya çok sık ya da çok seyrek, okuma ve yazma ne kadar süreceğine bağlı. okuma olabilir gibi görünüyor.
Site doktor da AudioRecord sınıf iç içe geçmiş bir sınıf bir arabirim olarak tanımlanan OnRecordPositionUpdateListener seçti diyor. Bu Bilgi gösteriyor ki bir şekilde belirttiğiniz süre istediğiniz için olmak haberdar ilerleme kaydedilmesi ve Adı olay işleyicisi ve bir çağrı otomatik olarak yapılan bir olay işleyicisi de belirtilen frekans. Yapı, sahte gibi bir şey olurdu sanırım
set target of period update message = myListener
set period to be about every 250 ms
other code
myListener()
{
if(record button was recently tapped)
handle message that another 250 ms of fresh audio is available
ie, read it and send it somewhere
)
Beni yakalamak için izin veren bazı özel kod bulmam lazım ve en az 500 ms gecikme ile mikrofon ses işlem. Android başka bir sınıf MediaRecorder fazla, ama streaming desteklemiyor, ve mikrofon ses canlı gerçek zamanlı yakın Wi-Fi üzerinden stream etmek istiyorum. Bazı özel örnekler bulabilirim?
CEVAP
Bildirimleri ile birçok diğer teknikler ve bir sürü deneme yaptıktan sonra bu kodu yerleşmiş:
private class AudioIn extends Thread {
private boolean stopped = false;
private AudioIn() {
start();
}
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
AudioRecord recorder = null;
short[][] buffers = new short[256][160];
int ix = 0;
try { // ... initialise
int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(AudioSource.MIC,
8000,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
N*10);
recorder.startRecording();
// ... loop
while(!stopped) {
short[] buffer = buffers[ix % buffers.length];
N = recorder.read(buffer,0,buffer.length);
process(buffer);
}
} catch(Throwable x) {
log.warning(TAG,"Error reading voice audio",x);
} finally {
close(recorder);
}
}
private void close() {
stopped = true;
}
}
Şimdiye kadar üzerinde çalıştım yarım düzine Android telefonlarda gayet sağlam çalışıyor.
Açıkça bir fonksiyonu geri arama ya da...
Basit Android Geri arama ne zaman bir ...
Neden sıralanmamış bir dizi daha hızlı...
Nasıl bir setTimeout için bir parametr...
'#_=_' Dönüş için Facebook G...