Как записать видео прямо на Helix Server с моего устройства Android?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

25
задан Robert Harvey 8 April 2013 в 18:40
поделиться

1 ответ

Соотношение между размером видео и пропускной способностью сетевой загрузки в заданном интервале времени является низким для одновременной загрузки / записи видеопотока, если только у пользователя нет очень быстрого сотового соединения LTE.

Однако, когда запись будет завершена, вы можете загрузить файл на свой сервер по протоколу FTP. Рекомендуется дать каждому записанному файлу Universal Unique Identifier (UUID), чтобы иметь возможность различать все другие записанные файлы. Я использовал этот код (не проверен для Android, но отлично работает на JavaSE 7). Поскольку это довольно долгий (но быстрый) процесс, я сделал вам резюме. (Хорошо, да?)

Резюме

1) Сгенерируйте UUID с UUID.randomUUID().toString();, который будет использоваться в течение всего процесса для идентификации записанного файла.
2) Запишите файл с именем "sdcard/" + uuid + ".3gp"
3) Когда запись закончится, загрузите файл на сервер через FTP-загрузку.
4) Прикажите вашему удаленному серверу выполнить скрипт PHP, который будет делать с записанным файлом все, что ему нужно, например, манипулирование базой данных и т. Д. (Если такой скрипт есть, если вам это не нужно, просто пропустите это шаг).
5) Закажите удаленный сервер, чтобы удалить файл, если это необходимо. (выполняется с помощью другого сценария PHP)

Код

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;

public class FTPUploader {
    static void doUpload(String uuid) {

      File fileSource = new File("/sdcard/" + uuid + ".3gp");
      // Or new File("/sdcard/recording.3gp");

      String fileName = fileSource.getName();

      /** YOUR SERVER'S INFORMATIONS **/
      String userName = "USERNAME";
      String password = "PASSWORD";
      String ftpServer = "FTP.SERVER.COM";
      /****/

      StringBuffer sb = new StringBuffer("ftp://");

      sb.append(userName);
      sb.append(':');
      sb.append(password);
      sb.append('@');

      sb.append(ftpServer);
      sb.append("/"); 
            /**WARNING: Path extension; it will be added after connection
            *The file must be at your server's root. Otherwise the PHP script won't detect it.
            **/
      sb.append(fileName);

      sb.append(";type=i");


      BufferedInputStream bis = null;
      BufferedOutputStream bos = null;
      try {

            URL url = new URL(sb.toString());
            URLConnection urlc = url.openConnection();
            bos = new BufferedOutputStream(urlc.getOutputStream());
            bis = new BufferedInputStream(new FileInputStream(fileSource));

            int i;

            // read byte by byte until end of stream
            while ((i = bis.read()) != -1) {
                  bos.write(i);
            }
      } catch (Exception e) {
            e.printStackTrace();
      } finally {

            if (bis != null)
                  try {
                        bis.close();
                  } catch (IOException ioe) {
                        ioe.printStackTrace();
                        System.out.println("IO exception after if bis " + ioe);
                  }
            if (bos != null)
                  try {
                        bos.close();
                  } catch (IOException ioe) {
                        ioe.printStackTrace();
                        System.out.println("IO exception after if " + ioe);
                  }
      }
}
}  



import java.util.UUID;

public class Main {


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


        String uuid = UUID.randomUUID().toString();
        //Assuming you set your file's name as uuid + ".3gp"
        FTPUploader.doUpload(uuid);            
        //Launches a FTP Upload


        //Then, if you want to ask your server to "process" the file you gave him, you can perform a simple HTTP request:

        try {
    String url = "http://YOURSITE.COM/shell.php";
    String charset = "iso-8859-1";
    String param1 = uuid;
    String query = String.format("id=%s", URLEncoder.encode(param1, charset));

        URLConnection connection = new URL(url + "?" + query).openConnection();
        connection.setRequestProperty("Accept-Charset", charset);
        connection.getInputStream();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
        //This try {}catch{} requests a PHP script: this script is "triggered" just like if it was loaded in your web browser, with as parameter the file UUID (`shell.php?id=UUID`), so that he knows wich file on his server he has to process.

}  

БОНУС : если вы хотите удалить файл с вашего сервера, когда закончите с ним, вы можете выполнить ту же строку, что и раньше, но заменив «shell.php» другим PHP-скриптом, который вы можете вызвать «delete.php». Он будет содержать следующие строки:

<?php
$recordedFile = 

Соотношение между размером видео и пропускной способностью сетевой загрузки в заданном интервале времени является низким для одновременной загрузки / записи видеопотока, если только у пользователя нет очень быстрого сотового соединения LTE.

Однако, когда запись будет завершена, вы можете загрузить файл на свой сервер по протоколу FTP. Рекомендуется дать каждому записанному файлу Universal Unique Identifier (UUID), чтобы иметь возможность различать все другие записанные файлы. Я использовал этот код (не проверен для Android, но отлично работает на JavaSE 7). Поскольку это довольно долгий (но быстрый) процесс, я сделал вам резюме. (Хорошо, да?)

Резюме

1) Сгенерируйте UUID с UUID.randomUUID().toString();, который будет использоваться в течение всего процесса для идентификации записанного файла.
2) Запишите файл с именем "sdcard/" + uuid + ".3gp"
3) Когда запись закончится, загрузите файл на сервер через FTP-загрузку.
4) Прикажите вашему удаленному серверу выполнить скрипт PHP, который будет делать с записанным файлом все, что ему нужно, например, манипулирование базой данных и т. Д. (Если такой скрипт есть, если вам это не нужно, просто пропустите это шаг).
5) Закажите удаленный сервер, чтобы удалить файл, если это необходимо. (выполняется с помощью другого сценария PHP)

Код

[110]

БОНУС : если вы хотите удалить файл с вашего сервера, когда закончите с ним, вы можете выполнить ту же строку, что и раньше, но заменив «shell.php» другим PHP-скриптом, который вы можете вызвать «delete.php». Он будет содержать следующие строки:

[111]

Например: следующий запрос http://www.YOURSERVER.com/delete.php?id=123456789 удаляет http://www.YOURSERVER.com/123456789.3gp на вашем сервере.

Другой пример кода

Несколько недель назад я установил приложение Java (я назвал его Atom ...), которое анализирует голос и отвечает на все вопросы (используя Google (неофициальный) Voice API распознавания и Wolfram | Alpha API). Вы обязательно должны взглянуть на это на GitHub , там есть все используемые файлы, как на стороне рабочего стола, так и на на стороне сервера . Надеюсь, я помог!

РЕДАКТИРОВАТЬ: Для работы с сервером Helix

я нашел этот учебник о Как управлять и использовать FTP на simplehelix.com и это видео Windows Server 2008 R2 - Настройка FTP-сервера . Вам нужно только следовать инструкциям, но пропустить шаг, называемый Вход в учетную запись FTP , потому что он только объясняет, как управлять файлами из клиента приложения (например, FileZilla или CuteFTP). Этот сделан из фрагмента Java, который я написал выше. Кроме того, если это может вам помочь, я нашел это видео .

ПРИМЕЧАНИЕ: В первом коде (Java), если корневой каталог, к которому обращается ваш FTP-сервер, не является папкой, содержащей все медиа-файлы, вам придется заменить sb.append("/"); по пути к папке, в которой / должны быть расположены потоковые медиафайлы. Пример формы, sb.append("/username/media/");.

GET['id'] . ".3gp"; unlink($recordedFile); ?>

Например: следующий запрос http://www.YOURSERVER.com/delete.php?id=123456789 удаляет http://www.YOURSERVER.com/123456789.3gp на вашем сервере.

Другой пример кода

Несколько недель назад я установил приложение Java (я назвал его Atom ...), которое анализирует голос и отвечает на все вопросы (используя Google (неофициальный) Voice API распознавания и Wolfram | Alpha API). Вы обязательно должны взглянуть на это на GitHub , там есть все используемые файлы, как на стороне рабочего стола, так и на на стороне сервера . Надеюсь, я помог!

РЕДАКТИРОВАТЬ: Для работы с сервером Helix

я нашел этот учебник о Как управлять и использовать FTP на simplehelix.com и это видео Windows Server 2008 R2 - Настройка FTP-сервера . Вам нужно только следовать инструкциям, но пропустить шаг, называемый Вход в учетную запись FTP , потому что он только объясняет, как управлять файлами из клиента приложения (например, FileZilla или CuteFTP). Этот сделан из фрагмента Java, который я написал выше. Кроме того, если это может вам помочь, я нашел это видео .

ПРИМЕЧАНИЕ: В первом коде (Java), если корневой каталог, к которому обращается ваш FTP-сервер, не является папкой, содержащей все медиа-файлы, вам придется заменить sb.append("/"); по пути к папке, в которой / должны быть расположены потоковые медиафайлы. Пример формы, sb.append("/username/media/");.

4
ответ дан guillaume 8 April 2013 в 18:40
поделиться
Другие вопросы по тегам:

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