Как разместить большое видео на сервере, в Android?

Я пытаюсь опубликовать большое видео (почти 1 ГБ).

Я использую FTP для отправки видео на сервер, но загрузка через некоторое время прекращается. На сервере происходит сбой видео, но я могу загрузить видео меньшего размера.

Я также использовал HTTP для отправки видео на сервер, отправленный как закодированная строка Base64, но при кодировании есть исключение из памяти .

Я пытался загрузить видео как файл, но безуспешно. Каков наилучший способ загрузки большого видео на сервер?

Используйте HTTP POST и отправляйте контент в виде загрузки на основе форм (тип mime: multipart / form-data). Эта система является стандартной в Интернете для отправки форм и / или загрузки файлов.

Используйте режим постфактум HTTP, так что размер не обязательно должен быть известен заранее, и вы можете передавать любой файл небольшими частями. Вы все равно должны сделать код на сервере (например, на PHP), чтобы принять файл и сделать то, что необходимо.

Используйте HttpURLConnection, чтобы начать соединение. Затем используйте мой прикрепленный класс для отправки данных. Он создаст правильные заголовки и т. Д., И вы будете использовать его как OutputStream для записи своих необработанных данных, затем вызовите близко, и все готово. Вы можете переопределить его onHandleResult для обработки полученного кода ошибки.

public class FormDataWriter extends FilterOutputStream{ private final HttpURLConnection con; /** * @param formName name of form in which data are sent * @param fileName * @param fileSize size of file, or -1 to use chunked encoding */ FormDataWriter(HttpURLConnection con, String formName, String fileName, long fileSize) throws IOException{ super(null); this.con = con; con.setDoOutput(true); String boundary = generateBoundary(); con.setRequestProperty(HTTP.CONTENT_TYPE, "multipart/form-data; charset=UTF-8; boundary="+boundary); { StringBuilder sb = new StringBuilder(); writePartHeader(boundary, formName, fileName==null ? null : "filename=\""+fileName+"\"", "application/octet-stream", sb); headerBytes = sb.toString().getBytes("UTF-8"); sb = new StringBuilder(); sb.append("\r\n"); sb.append("--"+boundary+"--\r\n"); footerBytes = sb.toString().getBytes(); } if(fileSize!=-1) { fileSize += headerBytes.length + footerBytes.length; con.setFixedLengthStreamingMode((int)fileSize); }else con.setChunkedStreamingMode(0x4000); out = con.getOutputStream(); } private byte[] headerBytes, footerBytes; private String generateBoundary() { StringBuilder sb = new StringBuilder(); Random rand = new Random(); int count = rand.nextInt(11) + 30; int N = 10+26+26; for(int i=0; i<count; i++) { int r = rand.nextInt(N); sb.append((char)(r<10 ? '0'+r : r<36 ? 'a'+r-10 : 'A'+r-36)); } return sb.toString(); } private void writePartHeader(String boundary, String name, String extraContentDispositions, String contentType, StringBuilder sb) { sb.append("--"+boundary+"\r\n"); sb.append("Content-Disposition: form-data; charset=UTF-8; name=\""+name+"\""); if(extraContentDispositions!=null) sb.append("; ").append(extraContentDispositions); sb.append("\r\n"); if(contentType!=null) sb.append("Content-Type: "+contentType+"\r\n"); sb.append("\r\n"); } @Override public void write(byte[] buffer, int offset, int length) throws IOException{ if(headerBytes!=null) { out.write(headerBytes); headerBytes = null; } out.write(buffer, offset, length); } @Override public void close() throws IOException{ flush(); if(footerBytes!=null) { out.write(footerBytes); footerBytes = null; } super.close(); int code = con.getResponseCode(); onHandleResult(code); } protected void onHandleResult(int code) throws IOException{ if(code!=200 && code!=201) throw new IOException("Upload error code: "+code); } } 

Думаю, это не получилось из-за тайм-аута большого размера.

поскольку

Видео с небольшим размером успешно загружено

, Мое предложение

  1. Разделите один большой файл на несколько небольших файлов.
  2. Загружайте один за другим или несколько вместе в зависимости от состояния сети.
  3. Присоединяйтесь ко всем частям (после всех загруженных файлов) на сервере.
  4. Из-за малого размера перезагрузка неудачной части будет легкой.

Просто терои.

Этот сайт может помочь.


Добавлено 08.01.2013

Это было какое-то время, не знаю, если вам все еще нужно это. Во всяком случае, я написал несколько простых кодов, реализующих теорию выше, из-за интереса в основном.

  1. Разделите один большой файл на несколько небольших файлов. Прочитайте большой файл на несколько мелких частей.

     ByteBuffer bb = ByteBuffer.allocate(partSize); int bytesRead = fc.read(bb); if (bytesRead == -1) { break; } byte[] bytes = bb.array(); parts.put(new Part(createFileName(fileName, i), bytes)); 
  2. Загружайте один за другим или несколько вместе в зависимости от состояния сети.

     Part part = parts.take(); if (part == Part.NULL) { parts.add(Part.NULL);// notify others to stop. break; } else { uploader.upload(part); } 
  3. Присоединяйтесь ко всем частям (после всех загруженных файлов) на сервере. Потому что это через HTTP, поэтому он может быть на любом языке, таком как Java, PHP, Python и т. Д. Вот пример java.

     ... try (FileOutputStream dest = new FileOutputStream(destFile, true)) { FileChannel dc = dest.getChannel();// the final big file. for (long i = 0; i < count; i++) { File partFile = new File(destFileName + "." + i);// every small parts. if (!partFile.exists()) { break; } try (FileInputStream part = new FileInputStream(partFile)) { FileChannel pc = part.getChannel(); pc.transferTo(0, pc.size(), dc);// combine. } partFile.delete(); } statusCode = OK;// set ok at last. } catch (Exception e) { log.error("combine failed.", e); } 

Я поместил все коды в GitHub . И сделал пример Android .

Пожалуйста, посмотрите, если вам все еще нужно.

Private HttpsURLConnection conn = null;

conn.setDoInput (истина);

conn.setDoOutput (истина);

conn.setUseCaches (ложный);

conn.setChunkedStreamingMode (1024);

Intereting Posts
Является ли google gson запущенным на Android? TextView – различные способы добавления drawable Местное вещание из Службы, не полученной по видам деятельности Правильный способ использования ТОЛЬКО гироскопа и акселерометра для получения надежного токового угла на любой оси на ANDROID Обработка keepSynced () в фоновом режиме на Android и с помощью FCM Поиск трассировки стека в Eclipse с Android Обмен изображениями в ImageView Как мигать изображение в ImageView (Android) Проект «Кинжал» без возможности молчания по getApplication override Показывать значение при нажатии Отсутствуют учетные данные аутентификации Twitter4j Текущий маркер местоположения Google Maps и оверлей точности Небезопасная реализация интерфейса X509TrustManager – Службы Google Play Странные сообщения «Не удалось отправить событие» и «Нет подписчиков, зарегистрированных для события» Как узнать, загружено ли объявление AdMob