2015-03-31 87 views
0

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

注意:使用的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); 
     } 

    } 

} 

回答

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