Как записать данные RAW в файл, используя Java?например, такой же как: nc -l 8000> capture.raw - PullRequest
1 голос
/ 04 октября 2011

В TCP я получаю медиапоток с IP-камеры как RAW.Согласно там советуют, мне нужно записать это как файл.И тогда я могу играть с медиаплеером, таким как VLC.

Но когда я записываю это в файл и играю с медиаплеерами, оно никогда не проигрывается.

После сравнения исходного файла я вижу, что мой Java пишет его неправильными символами.И там образец файла показывает разные.Что или как я могу исправить такую ​​проблему записи файла, вот как я пишу это:

byte[] buf=new byte[1024];
int bytes_read = 0;
try {  
    bytes_read = sock.getInputStream().read(buf, 0, buf.length);                
    String data = new String(buf, 0, bytes_read);                   
    System.err.println("DATA: " +  bytes_read + " bytes, data=" +data);

        BufferedWriter out = new BufferedWriter(
            new FileWriter("capture.ogg", true));
        out.write(data);
        out.close();

} catch (IOException e) {
    e.printStackTrace(System.err);
}

Ответы [ 3 ]

4 голосов
/ 04 октября 2011

Не следует использовать Readers, Writers и Strings для двоичных данных.Палка с InputStreams и OutputStreams.

Т.е., изменить

  • BufferedWriter -> BufferedOutputStream,
  • FileWriter -> FileOutputStream
  • и вместо String просто используйте byte[].

Если вы имеете дело с сокетами, я должен посоветовать вам заглянуть в NIOпакет хотя.

2 голосов
/ 04 октября 2011

Вы делаете это правильно ... по крайней мере до той части, где вы превращаете свой byte[] в String:

Этот шаг действительно имеет смысл, только если ваш byte[] представляет текстовые данные в первую очередь! Что это не !

Всякий раз, когда вы обрабатываете двоичные данные или на самом деле все равно, что представляют собой данные, вы должны избегать , используя String / Reader / Writer обрабатывать эти данные. Вместо используйте byte[] / InputStream / OutputStream.

Кроме того, вы должны читать из цикла в цикле, потому что ничто не гарантирует, что вы прочитали все:

byte[] buf=new byte[1024];
int bytes_read;
OutputStream out = new FileOutputStream("capture.ogg", true);
InputStream in = sock.getInputStream();
while ((bytes_read = in.read(buf)) != -1) {
    out.write(buf, 0, bytes_read);
}
out.close();
1 голос
/ 04 октября 2011

То, как вы это написали, ограничивает выходной файл максимальным размером 1024 байта. Попробуйте цикл:

    try {
        byte[] buf = new byte[1024];
        int bytes_read = 0;
        InputStream in = sock.getInputStream();
        FileOutputStream out = new FileOutputStream(new File("capture.ogg"));

        do {
            bytes_read = in.read(buf, 0, buf.length);
            System.out.println("Just Read: " + bytes_read + " bytes");

            if (bytes_read < 0) {
                /* Handle EOF however you want */
            }

            if (bytes_read > 0)
                  out.write(buf, 0, bytes_read);

        } while (bytes_read >= 0);

        out.close();

    } catch (IOException e) {
        e.printStackTrace(System.err);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...