【问题标题】:How to upload video file into webserver in android?如何将视频文件上传到android中的网络服务器?
【发布时间】:2012-09-03 23:48:56
【问题描述】:

您好,我想将我的视频文件上传到 Android 的网络服务器。我遵循了本教程:

Uploading files to HTTP server using POST on 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 媒体服务器。我该如何解决这个问题。我怎样才能在 wowza 服务器上进行?任何人都可以帮助我实现这一目标吗? 提前致谢。

【问题讨论】:

    标签: android video android-camera android-mediaplayer android-video-player


    【解决方案1】:

    从 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;
            }
    }
    

    【讨论】:

      【解决方案2】:

      这只是因为视频很大。 对大文件/视频使用块上传方法。

      这是在服务器上发布块数据的示例代码。

      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;
      }
      

      在服务器端获取所有块索引并组成一个视频文件。

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2015-10-22
        相关资源
        最近更新 更多