Android 流媒体和播放mp4视频
我想播放mp4视频。所以我尝试了下面的方法Android 流媒体和播放mp4视频,android,video-streaming,Android,Video Streaming,我想播放mp4视频。所以我尝试了下面的方法 private void playVideo() { try { final String path = s; Log.v(TAG, "path: " + path); if (path == null || path.length() == 0) { Toast.makeText(VideoPlay1.this, "File URL/p
private void playVideo() {
try {
final String path = s;
Log.v(TAG, "path: " + path);
if (path == null || path.length() == 0) {
Toast.makeText(VideoPlay1.this, "File URL/path is empty",
Toast.LENGTH_LONG).show();
} else {
// If the path has not changed, just start the media player
if (path.equals(current) && mVideoView != null) {
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(mVideoView);
Uri video = Uri.parse(getDataSource(path));
Log.e("Uri video",video.toString());
mVideoView.setMediaController(mediaController);
mVideoView.setVideoURI(video);
mVideoView.setVideoPath(getDataSource(path));
mVideoView.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer arg0) {
dialog.dismiss();
mVideoView.start();
}
});
mVideoView.requestFocus();
return;
}
current = path;
MediaController mediaController = new MediaController(this);
Uri video = Uri.parse(getDataSource(path));
Log.e("Uri video",video.toString());
mVideoView.setMediaController(mediaController);
mVideoView.setVideoURI(video);
mVideoView.setVideoPath(getDataSource(path));
mVideoView.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer arg0) {
dialog.dismiss();
mVideoView.start();
}
});
mVideoView.requestFocus();
}
} catch (Exception e) {
Log.e(TAG, "error123: " + e.getMessage(), e);
if (mVideoView != null) {
mVideoView.stopPlayback();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
&& keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
Log.d("CDA", "onKeyDown Called");
onBackPressed();
}
return super.onKeyDown(keyCode, event);
}
public void onBackPressed() {
Log.d("CDA", "onBackPressed Called");
mVideoView.stopPlayback();
Intent setIntent = new Intent(VideoPlay1.this,VideoPage.class);
startActivity(setIntent);
finish();
return;
}
private String getDataSource(String path) throws IOException {
if (!URLUtil.isNetworkUrl(path)) {
return path;
} else {
URL url = new URL(path);
URLConnection cn = url.openConnection();
cn.connect();
InputStream stream = cn.getInputStream();
if (stream == null)
throw new RuntimeException("stream is null");
File temp = File.createTempFile("mediaplayertmp", "dat");
temp.deleteOnExit();
String tempPath = temp.getAbsolutePath();
FileOutputStream out = new FileOutputStream(temp);
byte buf[] = new byte[128];
do {
int numread = stream.read(buf);
if (numread <= 0)
break;
out.write(buf, 0, numread);
} while (true);
try {
stream.close();
} catch (IOException ex) {
Log.e(TAG, "error: " + ex.getMessage(), ex);
}
return tempPath;
}
}
private void playVideo(){
试一试{
最终字符串路径=s;
Log.v(标签,“路径:”+path);
if(path==null | | path.length()==0){
Toast.makeText(VideoPlay1.this,“文件URL/路径为空”,
Toast.LENGTH_LONG).show();
}否则{
//如果路径没有改变,只需启动媒体播放器
if(path.equals(current)&&mVideoView!=null){
MediaController MediaController=新的MediaController(此);
mediaController.setAnchorView(mVideoView);
urivideo=Uri.parse(getDataSource(path));
Log.e(“urivideo”,video.toString());
mVideoView.setMediaController(mediaController);
mVideoView.setVideoURI(视频);
setVideoPath(getDataSource(path));
mVideoView.setOnPreparedListener(新的OnPreparedListener(){
已准备好公开作废(MediaPlayer arg0){
dialog.dismise();
mVideoView.start();
}
});
mVideoView.requestFocus();
返回;
}
电流=路径;
MediaController MediaController=新的MediaController(此);
urivideo=Uri.parse(getDataSource(path));
Log.e(“urivideo”,video.toString());
mVideoView.setMediaController(mediaController);
mVideoView.setVideoURI(视频);
setVideoPath(getDataSource(path));
mVideoView.setOnPreparedListener(新的OnPreparedListener(){
已准备好公开作废(MediaPlayer arg0){
dialog.dismise();
mVideoView.start();
}
});
mVideoView.requestFocus();
}
}捕获(例外e){
Log.e(标记“error123:+e.getMessage(),e);
如果(mVideoView!=null){
mVideoView.stopPlayback();
}
}
}
@凌驾
公共布尔onKeyDown(int-keyCode,KeyEvent事件){
if(Integer.parseInt(android.os.Build.VERSION.SDK)<5
&&keyCode==KeyEvent.keyCode\u返回
&&event.getRepeatCount()=0){
Log.d(“CDA”,“称为onKeyDown”);
onBackPressed();
}
返回super.onKeyDown(keyCode,event);
}
public void onBackPressed(){
Log.d(“CDA”、“onBackPressed Called”);
mVideoView.stopPlayback();
Intent setIntent=新的Intent(VideoPlay1.this,VideoPage.class);
星触觉(setIntent);
完成();
返回;
}
私有字符串getDataSource(字符串路径)引发IOException{
如果(!URLUtil.isNetworkUrl(路径)){
返回路径;
}否则{
URL=新URL(路径);
URLConnection cn=url.openConnection();
cn.connect();
InputStream=cn.getInputStream();
if(流==null)
抛出新的RuntimeException(“流为null”);
File temp=File.createTempFile(“mediaplayertmp”、“dat”);
temp.deleteOnExit();
字符串tempPath=temp.getAbsolutePath();
FileOutputStream out=新的FileOutputStream(临时);
字节buf[]=新字节[128];
做{
int numread=stream.read(buf);
如果(numread很抱歉,但是将视频流传输到移动设备需要时间。您受到连接的限制,而不是代码的限制。我知道已经有了一个可接受的答案,但可能还有其他条件可能会有所帮助,尤其是文件的编码
默认情况下,MP4视频的结尾通常有MOOV原子。“MOOV原子,也称为电影原子,定义电影的时间刻度、持续时间、显示特征,以及包含电影中每个曲目信息的子原子。”(http://www.adobe.com/devnet/video/articles/mp4_movie_atom.html)。如果您在开始时使用moov atom对视频进行编码(您可以使用FFMPEG进行编码),您的流媒体体验可能会得到改善。有任何其他方法可以同时流媒体和播放视频您可以使用MediaPlayer创建自己的视频播放器,但这就是VideoView。只要设备的流媒体足以开始播放,VideoView就会启动,因此您没有什么办法可以打败它