Android потоковое аудио на сервер - PullRequest
7 голосов
/ 20 декабря 2011

Я хотел бы понять, как работает сокет, особенно мне нужно несколько примеров кода на стороне сервера для получения потока, отправленного медиа-рекордером с устройства.

Большое спасибо за любую помощь.

Мое окончательное намерение - поговорить на устройстве и прослушать его на ПК, только в одном направлении.

В данный момент я могу отправить поток, используя следующий код:

String hostname = "192.168.1.10";
int port = 8000;
Socket socket = null;
    try {
        socket = new Socket(InetAddress.getByName(hostname), port);
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        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 {
        recorder.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

recorder.start();

1 Ответ

4 голосов
/ 06 января 2012

Кажется, все в порядке, но я бы лично предпочел буферизовать аудио на устройстве и отправить его на сервер из другого потока, вместо того, чтобы напрямую подключать рекордер к разъему, как вы. Поскольку локальная буферизация позволит вам корректно обрабатывать разрывы соединения.

Представьте, что вы записываете, и пользователь проходит через туннель и теряет подключение к Интернету - если вы выполняете прямую потоковую передачу, сокет закрывается, и пользователь будет раздражен :-) Однако, если вы буферизуете данные локально, Вы можете восстановить соединение и продолжить отправку аудио на сервер с того места, где вы остановились, и, надеюсь, пользователю даже не нужно знать, что разрыв соединения только что произошел, потому что он просто волшебным образом работает.

Чтобы это работало, вам нужно записать запись в локальный буфер и провести отдельную проверку потока на наличие новых данных в этом буфере и отправить его на сервер как можно скорее.

...