#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. Я знаю .. но в настоящее время я далек от этой ошибки, теперь я начинаю делать что-то еще и перестал работать над этим проектом, пока не закончу то, что у меня есть.