在Android中的套接字音频流

时间:2010-12-14 14:47:22

标签: android

我正在尝试在android上通过套接字进行音频流传输。 我使用AudioRecord在客户端获取录制的音频,使用AudioTrack类在服务器端播放原始数据。但我无法做到。 还有其他程序吗?

音频服务器文件

public void run()
{

  BufferedOutputStream bufferedStreamInstance = null;
  try
  {
    Socket socket = new Socket("192.168.1.25", 1234);
    bufferedStreamInstance = new BufferedOutputStream(
        socket.getOutputStream());
  } catch (FileNotFoundException e)
  {
    throw new IllegalStateException("Cannot Open File", e);
  } catch (UnknownHostException e)
  {
    e.printStackTrace();
  } catch (IOException e)
  {
    e.printStackTrace();
  }
  DataOutputStream dataOutputStreamInstance = new DataOutputStream(
      bufferedStreamInstance);

  int bufferRead = 0;
  int bufferSize = AudioRecord
      .getMinBufferSize(this.getFrequency(), this.getChannelConfiguration(), this.getAudioEncoding());
  AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, this.getFrequency(), this
      .getChannelConfiguration(), this.getAudioEncoding(), bufferSize);
  short[] tempBuffer = new short[bufferSize];

  recordInstance.startRecording();
  while (this.isRecording)
  {
    bufferRead = recordInstance.read(tempBuffer, 0, bufferSize);
    if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION)
    {
      throw new IllegalStateException(
          "read() returned AudioRecord.ERROR_INVALID_OPERATION");
    }
    else if (bufferRead == AudioRecord.ERROR_BAD_VALUE)
    {
      throw new IllegalStateException(
          "read() returned AudioRecord.ERROR_BAD_VALUE");
    }
    else if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION)
    {
      throw new IllegalStateException(
          "read() returned AudioRecord.ERROR_INVALID_OPERATION");
    }
    try
    {
      for (int idxBuffer = 0; idxBuffer < bufferRead; ++idxBuffer)
      {
        dataOutputStreamInstance.writeShort(tempBuffer[idxBuffer]);
      }
    } catch (IOException e)
    {
      throw new IllegalStateException(
          "dataOutputStreamInstance.writeShort(curVal)");
    }

  }
  recordInstance.stop();
  try
  {
    dataOutputStreamInstance.close();
    bufferedStreamInstance.close();

  } catch (IOException e)
  {
    throw new IllegalStateException("Cannot close buffered writer.");
  }
}

audioreceiver

public void run()
{

  musicLength = 66535;
  music = new short[musicLength];
  try
  {
    ServerSocket serverSocket = new ServerSocket(1234);
    Socket socket = serverSocket.accept();
    InputStream is = socket.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(is);

    dis = new DataInputStream(bis);
    while (dis.available() > 0)
    {
      music[musicLength - 1 - i] = dis.readShort();
      i++;
    }
    try
    {
      dis.close();
    } catch (IOException e)
    {
      e.printStackTrace();
    }
    audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025,
        AudioFormat.CHANNEL_CONFIGURATION_MONO,
        AudioFormat.ENCODING_PCM_16BIT, musicLength,
        AudioTrack.MODE_STREAM);
    audioTrack.play();
    audioTrack.write(music, 0, musicLength);
  } catch (Throwable t)
  {
    Log.e("AudioTrack", "Playback Failed");
  }
}

1 个答案:

答案 0 :(得分:2)

您无法发送数据吗?或者无法在接收器端正确播放?与MediaRecorder类一样,AudioRecorder类可能会为标题留出一些空间,然后在完成录制后执行搜索以填充标题。因为无法在套接字上进行查找,所以标头会写入文件的头部。我认为你最好的做法是将文件写入SD卡,然后使用hexeditor将字节与工作音频文件进行比较。然后,您应该能够确定标头的格式,并且当它被接收时,您可以寻找文件的开头(或缓冲区的开头)并将标头写在正确的位置。