VideoView在通过套接字接收文件时播放文件

时间:2015-03-31 15:23:22

标签: java android sockets video-streaming android-videoview

我有一个应用程序从另一个作为服务器的应用程序接收视频文件。当应用程序保存在套接字上接收的文件时,视频流开始播放文件(正在构建中)。在代码示例中,按下btnStream后,按btnPlay,App运行成功。但是,如果播放速率大于下载速率,则会发生错误。我想避免这种情况。所以我需要在视频播放上有一个监听器,它会在预测会发生此错误时暂停视频。我知道一个解决方案,如果我知道视频大小,我可以计算收到的字节数,并监视缓冲的秒数,看看视频是否应该暂停。但是,如果不知道视频文件大小,是否可以这样做?或者有两个相互依赖的线程?谢谢。

注意:使用的VideoView是一个可以播放FileDescriptor的自定义视频。

btnStream.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String s = etURL.getText().toString();
                String ip = "10.0.0.24";
                int port = 7878;
                mct= new VideoDownloadTask(ip,port);
                mct.execute();      

            }});
        final MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(mVideoView);


        Button btnPlay = (Button) findViewById(R.id.button2);
        btnPlay.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    mVideoView.setVideoFD((new FileInputStream(new File("/sdcard/tempVideo.mp4")).getFD()));
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                mVideoView.seekTo(0);
                mVideoView.start();

            }
        });
    }

    public class VideoDownloadTask extends AsyncTask<Void, Void, Void> {

        String dstAddress;
        int dstPort;
        String response = "";
        Socket socket=null;

        VideoDownloadTask(String addr, int port){
            dstAddress = addr;
            dstPort = port;
        }

        @Override
        protected Void doInBackground(Void... arg0) {

                try {
                    socket = new Socket(InetAddress.getByName(dstAddress), dstPort);
                } catch (UnknownHostException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    try {
                        if(socket!=null)socket.close();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }


                File f = new File("/sdcard/tempVideo.mp4");

                try {
                    f.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                DataInputStream in=null;
                try {
                    in = new DataInputStream (socket.getInputStream());
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                FileOutputStream videoFile = null;
                try {
                    videoFile = new FileOutputStream(f);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                int len;
                byte buffer[] = new byte[8192];

                try {
                    while((len = in.read(buffer)) != -1) {
                        videoFile.write(buffer, 0, len);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                try {
                    videoFile.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Toast.makeText(getApplicationContext(), "Done Downloading File", 
                       Toast.LENGTH_LONG).show();
            super.onPostExecute(result);
        }

    }

}

2 个答案:

答案 0 :(得分:1)

我应用了解决问题的简单解决方案。如果有人遇到同样的问题,我会分享它。解决方案只是向videoView添加一个错误监听器,它将阻止错误弹出并暂停视频。

mVideoView.setOnErrorListener(new OnErrorListener(){
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                // TODO Auto-generated method stub
                statusText.setText("ERROR PLAYING VIDEO");
                mVideoView.pause();
                return true;
            }
        });

答案 1 :(得分:0)

pDialog = new ProgressDialog(PlayVideoActivity.this);
pDialog.setTitle("Gajacharitra");
pDialog.setMessage("Buffering video...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();

try {
    // Start the MediaController
    mediacontroller.setAnchorView(mVideoView);
    // Get the URL from String VideoURL
    Uri video = Uri.parse(mVideoURL);
    mVideoView.setMediaController(mediacontroller);
    mVideoView.setVideoURI(video);
    mVideoView.requestFocus();
    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

        // Close the progress bar and play the video
        public void onPrepared(MediaPlayer mp) {

            pDialog.dismiss();
            mVideoView.start();
        }
    });

    mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {

        @Override
        public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {

            mVideoView.pause();
            pDialog.dismiss();
            Toast.makeText(PlayVideoActivity.this, "Can't play this video.", Toast.LENGTH_LONG).show();

            finish();
            return true;
        }
    });
} catch (Exception e) {

    /*Log.e("Error", e.getMessage());
    e.printStackTrace();*/

    pDialog.dismiss();
    Toast.makeText(PlayVideoActivity.this, "Can't play this video.", Toast.LENGTH_LONG).show();
    finish();
}