2012-03-19 8 views
6

Я хочу иметь функцию потоковой передачи аудио в реальном времени на устройстве Android, которое захватывает аудио через MIC устройства и отправляет его на сервер. Я знаю, чтобы отправить отправку аудиофайла после записи, но в случае реального времени мне нужна помощь. Может быть, это можно сделать, посылая массив байтов постоянно на сервер. Если да, то каким образом или каким-либо другим способом, поделитесь своими идеями. Благодарю.Потоковое аудио в реальном времени

Edit-

Android код клиента: -

public class Main extends Activity { 
    private MediaRecorder recorder; 

    private final String TAG = "AudioTest"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     String hostname = "192.168.50.25"; 
     int port = 2004; 

     Socket socket = null; 
     try { 
      socket = new Socket(InetAddress.getByName(hostname), port); 

     } catch (UnknownHostException e) { 

      Log.d(TAG, "Inside [email protected]@@@@@@@@@@@@@@@@@@@@@"); 

      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.d(TAG, "Inside IOException%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"); 

      e.printStackTrace(); 
     } 

     ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket); 

     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

     recorder.setOutputFile(pfd.getFileDescriptor()); 


     try { 
      Log.i(TAG, pfd.getFileDescriptor().toString()); 
     } catch (Exception e) { 
      Log.d(TAG, "Inside MyException################################"); 
     } 

     try { 
      recorder.prepare(); 
     } catch (IllegalStateException e) { 

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

      e.printStackTrace(); 
     } 

     recorder.start(); 

    } 

JAVA сервера код-

public class Provider { 
    ServerSocket providerSocket; 
    Socket connection = null; 
    ObjectOutputStream out; 
    ObjectInputStream in; 
    String message; 

    Provider() { 
    } 

    void run() { 
     try { 
      // 1. creating a server socket 
      providerSocket = new ServerSocket(2004, 10); 
      // 2. Wait for connection 
      System.out.println("Waiting for connection"); 

      connection = providerSocket.accept(); 
      System.out.println("Connection received from " 
        + connection.getInetAddress().getHostName()); 
      // 3. get Input and Output streams 
      out = new ObjectOutputStream(connection.getOutputStream()); 
      out.flush(); 
      in = new ObjectInputStream(connection.getInputStream()); 
      sendMessage("Connection successful"); 
      // 4. The two parts communicate via the input and output streams 
      do { 
       try { 
        message = (String) in.readObject(); 
        System.out.println("client>" + message); 
        if (message.equals("bye")) 
         sendMessage("bye"); 
       } catch (ClassNotFoundException classnot) { 
        System.err.println("Data received in unknown format"); 
       } 
      } while (!message.equals("bye")); 
     } catch (IOException ioException) { 
      ioException.printStackTrace(); 
     } finally { 
      // 4: Closing connection 
      try { 
       in.close(); 
       out.close(); 
       providerSocket.close(); 
      } catch (IOException ioException) { 
       ioException.printStackTrace(); 
      } 
     } 
    } 

    void sendMessage(String msg) { 
     try { 
      out.writeObject(msg); 
      out.flush(); 
      System.out.println("server>" + msg); 
     } catch (IOException ioException) { 
      ioException.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 
     Provider server = new Provider(); 
     while (true) { 
      server.run(); 
     } 
    } 
} 

ответ

5

Вы можете использовать сокеты в качестве так:

String hostname = "1.2.3.4"; 
int port = 865; 

Socket socket = null; 

try { 
    socket = new Socket(InetAddress.getByName(hostname), port); 
} catch (Exception e) { 

    e.printStackTrace(); 
} 

ParcelFileDescriptor socketedFile = ParcelFileDescriptor.fromSocket(socket); 

Затем установите socketedFile на выход файл (socketedFile.getFileDescriptor()) аудиомагнитофона. Это отправит его в виде байтов.

В качестве альтернативы, чтобы сделать его более стабильным, выпишите данные из MediaRecorder в локальный буфер, а затем попросите отдельный поток проверить этот буфер и записать его в сокет вместо этого, чтобы разрешить небольшие отключения в соединении сокетов.

Смотрите этот вопрос для получения дополнительной информации: android stream audio to server

Очевидно, то вам необходимо иметь приложение, работающее на сервере, чтобы получить свои байты и превратить это в аудиоданные.

+0

Hi Micky ... Спасибо большое за вашу заботу. Но я получаю другое исключение (java.io.StreamCorruptedException: недопустимый заголовок потока: 00000018). Пожалуйста, помогите в этом, если сможете. См. Отредактированный вопрос. – Nitin4Android

+0

+1 к вам ...... – Nitin4Android

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