1

我要流和从服务器VideoView下载视频文件,并显示它,以及感谢谷歌,VV不支持我的要求自然,所以这是我做了什么:如何使用Android的VideoView从本地存储中流媒体和下载媒体?

1 - 创建一个HTTP代理使用NanoHTTPD并开始下载从服务器

文件

2启动VideoView和URI在我的代理设置为我的HTTP代理

3内部服务器()我就开始回应VideoView一样具有适当真实服务器响应标题(我的意思是内容长度/内容范围,206响应)

但VideoView开始时,它正确地读取像300kb的视频文件,然后它从619kb或什么的请求。我没有任何线索,为什么VV想要跳过300,000字节并突然跳到619,000字节,并且经过10次尝试后,它会用VideoView的C++代码中的ERROR -1004响应我,我无法找到任何线索那。

以下是我的完整解决方案。 任何帮助是赞赏,因为我对VideoView无能为力,这是奇怪的行为!

注意:我已经故意修复了文件的大小,没有错。

package com.example.videoBuffer2; 

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.MediaController; 
import android.widget.VideoView; 

import java.io.*; 
import java.util.Map; 

public class MyActivity extends Activity { 
    /** 
    * Called when the activity is first created. 
    */ 
    Button btn; 
    VideoView videoView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     btn = (Button) findViewById(R.id.button); 
     videoView = (VideoView) findViewById(R.id.videoView); 
     MediaController mediaController = new 
       MediaController(this); 
     videoView.setMediaController(mediaController); 
     final VideoStreamServer server = new VideoStreamServer(9090); 

     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        server.start(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       videoView.setVideoURI(Uri.parse("http://127.0.0.1:9090/1.mp4")); 
       videoView.requestFocus(); 

       videoView.start(); 
      } 
     }); 
    } 


    public class VideoStreamServer extends NanoHTTPD 
    { 

     public VideoStreamServer(int port) { 
      super(port); 
     } 

     @Override 
     public Response serve(String uri, Method method, Map<String, String> headers, Map<String, String> parms, Map<String, String> files) { 

      //range=bytes=619814- 
      long range; 

      if (headers.containsKey("range")) 
      { 
       String contentRange = headers.get("range"); 
       range = Integer.parseInt(contentRange.substring(contentRange.indexOf("=") + 1, contentRange.indexOf("-"))); 
      } 
      else 
       range = 0; 


      byte[] buffer; 
      int constantLength = 256000; 
      long bufLength=0; 
      boolean isLastPart=false; 
      try { 

       RandomAccessFile ff =new RandomAccessFile(new File("/mnt/sdcard","1.mp4"),"rw"); 
       long remainingChunk = ff.length() - range; //remaining 
       if (remainingChunk < constantLength){ 
        bufLength= remainingChunk; //means last part 
        isLastPart = true; 
       } 

       else 
        bufLength = constantLength; 
       if (range !=0) 
        ff.seek(range); 
       buffer= new byte[(int)bufLength]; 


       ff.read(buffer); 


      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
       buffer = new byte[0]; 
      } catch (IOException e) { 
       e.printStackTrace(); 
       buffer = new byte[0]; 
      } 
      Response response; 
//   if (isLastPart) 
//    response = new Response(Response.Status.OK,"video/mp4",new ByteArrayInputStream(buffer)); 
//   else 
       response = new Response(Response.Status.PARTIAL_CONTENT,"video/mp4",new ByteArrayInputStream(buffer)); 

      response.addHeader("Content-Length","891064"); 
      response.addHeader("Content-Range",String.format("bytes %s-%s/%s", range,(range+bufLength),"891064")); 
      Log.e("SERVER","Inside server sent " + String.format("bytes %s-%s/%s", range,(range+bufLength),"891064")); 
      return response; 

     } 
    } 
} 

回答

-2

最后,我发现我的问题,问题不在于代码,但我用过的媒体并非根据谷歌的文档标准。

您可以在这里阅读更多:http://www.vahidhashemi.com/?p=120