@Severovostok

Стриминг видео с камеры на сервер не записывая на SDCARD?

Имеется код на стороне клиента:

try {
            socket = new Socket(InetAddress.getByName(hostname), port);
            pfd = ParcelFileDescriptor.fromSocket(socket);

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

  recorder.setOutputFile(pfd.getFileDescriptor()); 

  //  String filename = String.format("/sdcard/%d.mp4", System.currentTimeMillis());
  // 
  // recorder.setOutputFile(filename);

    try
        {
        recorder.prepare();
            recorder.start();
        }
        catch (IllegalStateException e)
        {
        e.printStackTrace();
        }
        catch (IOException e)
        {
        e.printStackTrace();
        }
    }


и код собственно сервера:

 try
                {
                System.out.println("create sock");
                ServerSocket svsock = new ServerSocket(1935);

                System.out.println("accept");
                Socket sock = svsock.accept();
                System.out.println("buffer read");

                FileOutputStream outFile = null;

    String filename = String.format("%d.mp4", System.currentTimeMillis());

                   try {
                                        outFile = new FileOutputStream(filename);
                                        System.out.println(filename);
                                } catch (IOException e1) {
                                        e1.printStackTrace();
                                }

                  InputStream is = new DataInputStream(sock.getInputStream());
                                byte[] byteBuffer = new byte[1024];

                                int allsize = 0;
                                while(sock.isConnected()) {

                                    int size = is.read(byteBuffer);
                                        if (size == -1){
                                                break;
                                        } else {
                                                outFile.write(byteBuffer, 0, size);
                                        }
                                        allsize += size;

                                }
                                System.out.println("close size=" + allsize);
                                outFile.close();
                                sock.close();

                }
                catch(Exception e)
                {
                        e.printStackTrace();
                }       

                System.out.println("endmain");
        }
}


При запуске приложения на Android 2.2.2 (HTC quiet brilliant) все работает отлично. Я нажимаю кнопку открывается сокет на сервер, который записывает данные в файл. И файл этот затем успешно воспроизводится тем же VLC плеером.

Однако, когда я тестирую на Android 4.0.4 (Galaxy S2), сервер также создает файл и записывает в него данные, но при попытке воспроизвести файл VLC выдает ошибку

mp4 error: MP4 plugin discarded (no moov,foov,moof box) avcodec error: Could not open �codec demux error: Specified event object handle is invalid ps error: cannot peek main error: no suitable demux module for `file/:///C:/1345461283455.mp4'

Другие плееры также отказываются его воспроизводить. (пробовал даже загрузить на youtube, но он также выдал мне ошибку формата файла). при этом если я не записываю на сервер а записываю на sdcard телефона, то все отлично создается и проигрывается.

Тут может быть ошибка как на стороне сервера, так и какая-то новинка на API 15 (4.0.4). Может что-то надо добавить к getFileDescriptor() и т.д.

Помогите советом, пожалуйста, или по крайней мере не ставьте минус. Я долго и безуспешно гуглил, перед тем как накатать такой огромный вопрос :)
  • Вопрос задан
  • 2889 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы