Как воспроизвести видео с устройства Android на сервер? - PullRequest
2 голосов
/ 06 октября 2011

У меня есть приложение для потоковой передачи видео / аудио с устройства Android на сервер Потоковая передача в порядке, но когда я сохраняю потоковые данные из MediaRecoreder, я не могу воспроизвести файл

Код Android:

String hostname = "000.000.000.000";
int port = 0000;
Socket socket = null;
try {
socket = new Socket(InetAddress.getByName(hostname), port);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
MediaRecorder recorder =  new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(pfd.getFileDescriptor());
recorder.start();

на стороне сервера:

Socket userSocket = socket.accept();
//DataInputStream dis;
dis = new  DataInputStream(userSocket.getInputStream());
while(true){
        dis.read(buf , 0 , buf.length);
        saveBufferToFile(buf);
}

Теперь я сохраняю буфер с помощью FileOutStream .write (); метод, но выходной файл не может быть воспроизведен вообще.

после исследования я понимаю, что мне нужно добавить заголовки mp4 в файл перед тем, как записать в него данные, НО я не знаю, как это сделать!?

С уважением,

1 Ответ

0 голосов
/ 09 февраля 2012

Во-первых, контейнер MPEG4 - это больше, чем просто «заголовки» для видеоданных.

Во-вторых, код на стороне сервера мне не кажется правильным.Я предполагаю, что это Java.В частности:

dis = new  DataInputStream(userSocket.getInputStream());
while(true){
    dis.read(buf , 0 , buf.length);
    saveBufferToFile(buf);
}

В частности, DataInputStream.read() не обязательно считывает всю длину буфера.JavaDocs говорит:

Предпринята попытка прочитать столько же, сколько и байтов, но можно прочитать меньшее число, возможно, ноль.

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

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

...