Как загрузить видео файл на веб-сервер в Android?

Привет, я хочу загрузить видеофайл на веб-сервер в Android. Я следовал этому уроку:

Загрузка файлов на HTTP-сервер с помощью POST на Android.

Но. Я получил эту ошибку в моем logcat. И я получил сообщение с сервера тоже.

 09-11 10:20:55.088: D/dalvikvm(284): GC_FOR_MALLOC freed 1137 objects / 74200 bytes in 70ms
 09-11 10:20:55.768: I/dalvikvm-heap(284): Grow heap (frag case) to 3.611MB for 1048592-byte allocation
 09-11 10:20:55.918: D/dalvikvm(284): GC_FOR_MALLOC freed 202 objects / 10144 bytes in 142ms
 09-11 10:20:56.178: D/dalvikvm(284): GC_FOR_MALLOC freed 86 objects / 3424 bytes in 91ms
 09-11 10:20:56.568: I/dalvikvm-heap(284): Grow heap (frag case) to 5.601MB for 2097364-byte allocation
 09-11 10:20:56.868: D/dalvikvm(284): GC_FOR_MALLOC freed 2 objects / 56 bytes in 304ms
 09-11 10:20:57.178: D/dalvikvm(284): GC_FOR_MALLOC freed 4 objects / 1120 bytes in 48ms
 09-11 10:20:57.748: I/dalvikvm-heap(284): Grow heap (frag case) to 11.600MB for 6291668-byte allocation
 09-11 10:20:57.918: D/dalvikvm(284): GC_FOR_MALLOC freed 0 objects / 0 bytes in 168ms
 09-11 10:21:24.827: I/uploadFile(284): HTTP Response is : OK: 200
 09-11 10:21:24.847: E/Debug(284): Server Response There was an error uploading the file, please try again!
 09-11 10:21:24.858: I/System.out(284): RES : 200
 09-11 10:21:24.997: WARN/InputManagerService(59): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44ff6cc8
 09-11 10:23:34.277: DEBUG/SntpClient(59): request time failed: java.net. Socket Exception: Address family not supported by protocol

Следуйте этому процессу, я хочу загрузить видео файл на Wowza Media Server. Как я могу решить это. И как я могу продолжить на сервере Wowza? Кто-нибудь может помочь мне достичь этого? Заранее спасибо.

2 ответа

Отправка видео на сервер из byte[] может вызвать outOfMemoryError, поэтому лучше размещать видео из MultiPart. Вы можете скачать файл JAR по этой ссылке. http://hc.apache.org/downloads.cgi. Загрузите и добавьте httpmime-4.2.jar в свой проект.

public void uploadVideo(Context context, String videoPath) {
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost postRequest = new HttpPost(context.getString(R.string.url_service_fbpost));
            MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            if(!videoPath.isEmpty()){

                FileBody filebodyVideo = new FileBody(new File(videoPath));
                reqEntity.addPart("uploaded", filebodyVideo);
            }
            postRequest.setEntity(reqEntity);
            HttpResponse response = httpClient.execute(postRequest);

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent(), "UTF-8"));
            String sResponse;
            StringBuilder s = new StringBuilder();

            while ((sResponse = reader.readLine()) != null) {
                s = s.append(sResponse);
            }

            Log.e("Response: ", s.toString());
            return true;

        } catch (Exception e) {
            Log.e(e.getClass().getName(), e.getMessage());
            return false;
        }
}

Это просто из-за большого размера видео. Используйте подход загрузки чанка для большого файла / видео.

Вот пример кода для публикации данных чанка на сервере.

public void upload(String filename, byte[] image) {
     // 1MB of chunk
    byte[][] divideByte = divideArray(image, ((1024 * 1024)/2));
    int length = divideByte.length;
    String token = "" + (int)System.currentTimeMillis();
    Log.i("System out", "divideByte:" + length);
    Log.i("System out", "token:" + token);

    for (int i = 0; i < length; i++) {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

        String link = "<your link>";

        nameValuePairs.add(new BasicNameValuePair("filename", filename));// filename
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(link);
        Log.i("System out", "divideByte[" + i + "] length :"
                + divideByte[i].length);
        String img = Base64.encodeBytes(divideByte[i]);
        nameValuePairs.add(new BasicNameValuePair("file64", img));

        nameValuePairs.add(new BasicNameValuePair("token", new String(""
                + token)));
        nameValuePairs.add(new BasicNameValuePair("chunksize", new String(""+
                divideByte[i].length)));
        nameValuePairs.add(new BasicNameValuePair("chunkcount", new String(
                "" + length)));
        nameValuePairs.add(new BasicNameValuePair("index", new String(""
                + i)));
        try {
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity httpEntity = response.getEntity();
            if (httpEntity != null) {
                String res = EntityUtils.toString(httpEntity).toString();
                Log.i("System out", "response is :" + res);                 
            }
            httpEntity = null;
            response = null;
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            httppost = null;
            httpclient = null;
        }           
    }
}

public static byte[][] divideArray(byte[] source, int chucksize) {

    byte[][] ret = new byte[(int) Math.ceil(source.length
            / (double) chucksize)][chucksize];

    Log.i("System out","ret: "+ret.length);
    int start = 0;

    for (int i = 0; i < ret.length; i++) {
        if (start + chucksize > source.length) {
            System.arraycopy(source, start, ret[i], 0, source.length
                    - start);
        } else {
            System.arraycopy(source, start, ret[i], 0, chucksize);
        }

        start += chucksize;
    }

    return ret;
}

и на стороне сервера получите индекс всех блоков и составьте один видеофайл.

Надеюсь помочь вам.

Другие вопросы по тегам