2010-05-01 3 views
16

Для моего приложения мне нужно записать аудио с MIC на Android-телефоне и отправить его через TCP на другой Android-телефон, где он должен быть воспроизведен.Android: потоковое аудио через TCP-сокеты

Я использую AudioRecord и AudioTrack класс. Это отлично работает с файлом - записывайте аудио в файл с помощью DataOutputStream и читайте его с помощью DataInputStream.

Однако, если я получаю один и тот же поток из сокета вместо файла и пытаюсь записать его, я получаю исключение.

Я затрудняюсь понять, что может произойти неправильно. Любая помощь будет принята с благодарностью.

EDIT: проблема такая же, даже если я попробую с большими размерами буфера (65535 байт, 160000 байт).

Это код:

Recorder:

int bufferSize = AudioRecord.getMinBufferSize(11025, , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 

AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); 

byte[] tempBuffer = new byte[bufferSize]; 

recordInstance.startRecording(); 

while (/*isRecording*/) { 
     bufferRead = recordInstance.read(tempBuffer, 0, bufferSize); 
     dataOutputStreamInstance.write(tempBuffer); 
} 

DataOutputStream выше получается:

BufferedOutputStream buff = new BufferedOutputStream(out1); //out1 is the socket's outputStream 
DataOutputStream dataOutputStreamInstance = new DataOutputStream (buff); 

Не могли бы вы, пожалуйста, смотрите, и дайте мне знать, что это что я могу ошибаться здесь?

Спасибо,

+0

Вам удалось отправить аудиофайл на другие устройства? – B770

ответ

8

Я получил эту работу, с некоторой помощью, и только частично.

Я начал с кода в http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html, изменил потоки Файла на потоки Socket и изменил isAvailable() на if (inputStream.read (byteArray)! = -1).

Прямая передача аудио через TCP происходит сейчас.

Однако

Все, что я слышал на другом конце шум, и я теперь охота для правильного набора параметров для AudioRecorder и аудиодорожки - частоты, каналов конфигурации и кодирования, источника звука и т.д.

Если у вас есть какие-либо идеи, сообщите мне.

Спасибо,

EDIT: Это была глупая ошибка с моей стороны. В дополнение ко всему, что я сказал выше, используйте inputStream на стороне игрока и outputStream на стороне рекордера, а массивы байтов вместо шорт, и он будет работать.:)

+0

Хотя я копаю какую-то старую нить .. Не могли бы вы поместить свой код (изменения сделаны) ?? –

+0

Привет, Чайтанья, Как вы поступили с тем же кодом? Я не могу выполнять потоковое воспроизведение аудио через TCP. Можете ли вы мне помочь? – iMOBDEV

1

, не зная конкретное исключение, вы получаете, это трудно точно знать, что это неправильно. Это также поможет увидеть код, который вы используете, для создания out1 (то есть кода сокета).

Что-то, на что вы можете обратить внимание, это количество данных, считанных с recordInstance.read(); вы можете не получить целых bufferSize -размерную часть данных из него, поэтому вам нужно позаботиться только о том, чтобы записать байты 0 через bufferRead-1 в выходной разъем.

+0

Большое спасибо за ответ. – Chaitanya

Смежные вопросы