Как воспроизвести видео, передаваемое с устройства Android на сервер?

#android #video #header #streaming #mp4

#Android #Видео #заголовок #потоковая передача #МР4

Вопрос:

У меня есть приложение, в котором потоковое видео / аудио с устройства 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:

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

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

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

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

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

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

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

Комментарии:

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

2. @daigoor: Проблема не в чтении всех байтов. Это связано с записью слишком большого количества байтов. В каждом цикле вы записываете весь буфер целиком, независимо от того, был он заполнен при чтении или нет. Вероятность чтения из сети и заполнения буфера при каждом чтении в течение всего срока действия файла практически равна нулю. Пока вы не решите эту проблему, вы никогда не продвинетесь дальше.

3. Я знаю .. но в настоящее время я далек от этой ошибки, теперь я начинаю делать что-то еще и перестал работать над этим проектом, пока не закончу то, что у меня есть.