Android играть волновой поток через сокет TCP - PullRequest
1 голос
/ 23 ноября 2011

Я не знаю, как воспроизводить аудио поток в режиме реального времени через разъем. Теперь у меня есть сокет аудиопотока. формат потока:

wav format header +pcm data
wav format header +pcm data 
wav format header +pcm data

Итак, как мне разобрать живой аудиопоток для воспроизведения в классе AudioTrack в Android. Благодарю. Вот мой код:

private void PlayAudio(int mode)
{

   if(AudioTrack.MODE_STATIC != mode && AudioTrack.MODE_STREAM != mode)
        throw new InvalidParameterException();
    long bytesWritten = 0;
    int bytesRead = 0;
    int bufferSize = 0;
    byte[] buffer;
    AudioTrack track;

    Socket socket=null;
    DataInputStream dIn=null;


      bufferSize = 55584; // i donnt know how much the buffer size should be. 55584 is the size that i got first from the socket stream.  maybe the buffer size is setted wrong.


    //sample rate 16khz,channel: mono sample bits:16 bits channel:1
            bufferSize = AudioTrack.getMinBufferSize(16000,
        AudioFormat.CHANNEL_CONFIGURATION_MONO,
        AudioFormat.ENCODING_PCM_16BIT);

    buffer = new byte[bufferSize];

    track = new AudioTrack(AudioManager.STREAM_MUSIC, 16000, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 
        bufferSize, mode);
    // in stream mode, 
    //   1. start track playback
    //   2. write data to track

    if(AudioTrack.MODE_STREAM == mode)
        track.play(); 

    try
    {
        socket = new Socket("192.168.11.123", 8081);
        dIn = new DataInputStream(socket.getInputStream());
    //          dIn.skipBytes(44);

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }


    try
    {
        do
        {
            long t0 = SystemClock.elapsedRealtime();
            try
            {
                bytesRead = dIn.read(buffer, 0, buffer.length);

            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (NullPointerException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            bytesWritten += track.write(buffer, 0, bytesRead);

            Log.e("debug", "WritesBytes "+bytesRead);

        } while (dIn.read() != -1);

    }


    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }

У меня отключился звук, когда я выполняю упражнение, но я могу периодически слышать музыку в режиме отладки, но она шумная Не могли бы вы мне помочь ? сервер отправляет поток с интервалом 100 мс: аудиоформат: // частота дискретизации 16 кГц, канал: моно выборочные биты: 16 бит, канал: 1

...