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

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

Код андроида:

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 в файл, прежде чем я запишу в него данные, НО я не знаю, как это сделать!?

С уважением,


person daigoor    schedule 06.10.2011    source источник


Ответы (1)


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

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

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

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

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

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

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

person Stu Thompson    schedule 09.02.2012
comment
Хорошо, я уверен, что прочитал все байты и сохранил файл на устройстве и на сервере! это не решит проблему! пока искал эту проблему! Я обнаружил, что мне нужно добавить заголовок файла и нижний колонтитул, и они содержат длину содержимого файла, и я не могу знать, сколько я сэкономил! поэтому я думаю, что это неразрешимая проблема, и я должен найти другой способ передачи данных с устройства Android на сервер. - person daigoor; 13.02.2012
comment
@daigoor: проблема не в чтении всех байтов. Это при записи слишком большого количества байтов. В каждом цикле вы записываете весь буфер независимо от того, был ли он заполнен при чтении. Вероятность чтения из сети и заполнения буфера при каждом чтении на протяжении всего файла практически отсутствует. Пока вы не решите эту проблему, вы никогда не продвинетесь дальше. - person Stu Thompson; 13.02.2012
comment
Я знаю.. но я в настоящее время далек от этой ошибки, теперь я начинаю заниматься чем-то другим, и я прекратил работу над этим проектом, пока не закончу то, что у меня есть. - person daigoor; 15.02.2012