Ответ 1
Соотношение между размером видео и пропускной способностью сети в заданный интервал времени является низким, чтобы одновременно загружать/записывать видеопоток, если у пользователя нет очень быстрого сотового соединения LTE.
Однако, когда запись завершена, вы можете загрузить файл на свой сервер через протокол FTP. Рекомендуется, чтобы каждый записанный файл был Universal Unique Identifier (UUID)
, чтобы иметь возможность различать все остальные записанные файлы. Я использовал этот код (не тестировался для Android, но отлично работает на JavaSE 7). Поскольку это довольно длинный (но быстрый) процесс, я сделал вам резюме. (Ницца, да?)
Резюме
1) Создайте UUID с UUID.randomUUID().toString();
, который будет использоваться в течение всего процесса для идентификации записанного файла.
2) Запишите файл с именем "sdcard/" + uuid + ".3gp"
3) Когда запись заканчивается, загрузите файл на свой сервер через FTP-загрузку.
4) Закажите свой удаленный сервер для выполнения PHP скрипт, который делает все, что ему нужно, с записанным файлом, например, с манипуляциями с базой данных и т.д. (Если есть такой script, если вам не нужно это делать, просто пропустите этот шаг).
5) Закажите удаленный сервер, чтобы удалить файл, если это необходимо. (выполняется через другой PHP script)
код
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 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 root. Otherwise the PHP скрипт 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 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 скрипт: 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 script, которую вы можете назвать "delete.php". Он будет содержать следующие строки:
<?php
$recordedFile = $_GET['id'] . ".3gp";
unlink($recordedFile);
?>
Например: следующий запрос http://www.YOURSERVER.com/delete.php?id=123456789
удаляет http://www.YOURSERVER.com/123456789.3gp
на вашем сервере.
Другой пример кода
Несколько недель назад я создал приложение Java (я назвал его Atom...), которое анализирует голос и отвечает на все вопросы (используя Google (неофициальный) API распознавания голоса и Wolfram | Alpha API). Вы должны определенно взглянуть на него на GitHub, есть все файлы, используемые как на стороне рабочего, так и на на стороне сервера. Надеюсь, я помог!
EDIT: для работы с сервером Helix
Я нашел этот урок о Как управлять и использовать FTP на simplehelix.com, и это видео Windows Server 2008 R2 - настройка FTP-сервера. Вам нужно только следовать инструкциям, но пропустить шаг, называемый Вход в учетную запись FTP, поскольку он объясняет, как управлять файлами из приложения-клиента (например, FileZilla или CuteFTP). Этот выполнен с фрагментом Java, который я написал выше. Кроме того, если это может вам помочь, я нашел это видео.
ПРИМЕЧАНИЕ.. В первом коде (Java), если корневой каталог, к которому обращается ваш FTP-сервер, является папкой, содержащей все медиафайлы, вы должны заменить sb.append("/");
по пути к папке, в которой должны находиться/должны располагаться файлы мультимедиа. Пример формы, sb.append("/username/media/");
.