android 播放网络视频! 急!!!!

jain113 2012-05-10 11:14:47
package com.cn;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

/**
* @description 通过SurfaceView/SurfaceHolder实现自己的播放器
* @description 这里进行一下补充说明,我们可以通过mediaplayer添加OnPreparedListener
* 以及OnCompletionListener等事件对准备好播放以及播放完成后的操作进行控制。
* 使用SurfaceView以及SurfaceHolder进行视频播放时,结构是这样的:
* 1、首先,我们从布局文件中获取一个surfaceView
* 2、通过surfaceView.getHolder()方法获取与该容器想对应的surfaceHolder
* 3、对srufaceHolder进行一些默认的设置,如addCallback()和setType()
* 4、通过mediaPlayer.setDisplay()方法将视频播放与播放容器链接起来
*/
public class TestInternetActivity extends Activity {

MediaPlayer mediaPlayer; // 播放器的内部实现是通过MediaPlayer
SurfaceView surfaceView;// 装在视频的容器
SurfaceHolder surfaceHolder;// 控制surfaceView的属性(尺寸、格式等)对象
boolean isPause; // 是否已经暂停了

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
/**
* 获取与当前surfaceView相关联的那个的surefaceHolder
*/
surfaceHolder = surfaceView.getHolder();
/**
* 注册当surfaceView创建、改变和销毁时应该执行的方法
*/
surfaceHolder.addCallback(new SurfaceHolder.Callback() {

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i("通知", "surfaceHolder被销毁了");
if (mediaPlayer != null)
mediaPlayer.release();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("通知", "surfaceHolder被create了");
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
Log.i("通知", "surfaceHolder被改变了");
}
});

/**
* 这里必须设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS哦,意思
* 是创建一个push的'surface',主要的特点就是不进行缓冲
*/
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

/***
* @param targetButton
* 被用户点击的按钮
*/
public void buttonClick(View targetButton) {
int buttonId = targetButton.getId();
switch (buttonId) {
case R.id.button_play:
play();
break;
case R.id.button_pause:
pause();
break;
case R.id.button_reset:
reset();
break;
case R.id.button_stop:
stop();
break;
default:
break;
}

}

/**
* 播放
*/
private void play() {

mediaPlayer = new MediaPlayer();
// 设置多媒体流类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

// 设置用于展示mediaPlayer的容器
mediaPlayer.setDisplay(surfaceHolder);
try {
// mediaPlayer.setDataSource("/sdcard/001.mp4");
mediaPlayer
.setDataSource("http://192.168.1.114:8080/webdav/china.3gp");
mediaPlayer.prepareAsync();
mediaPlayer.start();
isPause = false;
} catch (Exception e) {
// Log.i("通知", "播放过程中出现了错误哦");
e.printStackTrace();
}
}

/**
* 暂停
*/
private void pause() {
Log.i("通知", "点击了暂停按钮");
if (isPause == false) {
mediaPlayer.pause();
isPause = true;
} else {
mediaPlayer.start();
isPause = false;
}
}

/**
* 重置
*/
private void reset() {
Log.i("通知", "点击了reset按钮");
// 跳转到视频的最开始
mediaPlayer.seekTo(0);
mediaPlayer.start();
}

/**
* 停止
*/
private void stop() {
Log.i("通知", "点击了stop按钮");
mediaPlayer.stop();
mediaPlayer.release();

}
}


为什么在播放网络视频的时候会报

05-10 03:14:44.555: ERROR/gralloc(52): [unregister] handle 0x274308 still locked (state=40000001)
05-10 03:14:47.408: ERROR/MediaPlayer(2060): start called in state 4
05-10 03:14:47.408: ERROR/MediaPlayer(2060): error (-38, 0)
05-10 03:14:47.425: ERROR/MediaPlayer(2060): Error (-38,0)

05-10 03:14:48.095: WARN/MediaPlayer(2060): info/warning (1, 26)
05-10 03:14:48.107: INFO/MediaPlayer(2060): Info (1,26)
05-10 03:14:48.136: ERROR/PlayerDriver(31): Command PLAYER_INIT completed with an error or info PVMFFailure
05-10 03:14:48.136: ERROR/MediaPlayer(2060): error (1, -1)
05-10 03:14:48.146: ERROR/MediaPlayer(2060): Error (1,-1)

05-10 03:14:48.146: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete
05-10 03:14:49.336: DEBUG/dalvikvm(225): GC freed 43 objects / 1968 bytes in 90ms
05-10 03:14:54.385: DEBUG/dalvikvm(106): GC freed 2514 objects / 142304 bytes in 132ms




这样的错啊? 但在播放本地视频时又能正常播放? 希望有高手解答!!!!
...全文
2178 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
juxq 2013-12-11
  • 打赏
  • 举报
回复
mediaPlayer.setDataSource("http://192.168.1.114:8080/webdav/china.3gp"); 此处用法不对。 应该: Uri uri = Uri.parse("http://192.168.1.114:8080/webdav/china.3gp"); mediaPlayer.setDataSource(this, uri);
ericfail 2012-09-26
  • 打赏
  • 举报
回复
i am studying your document
srgzf 2012-05-11
  • 打赏
  • 举报
回复
太强了,这玩意不懂,学习
qdkfriend 2012-05-10
  • 打赏
  • 举报
回复
网络视频的协议可不是http 是rtsp
这是流媒体
你播放本地 你那是操作本来文件播放
网络的可不能这么搞
ameyume 2012-05-10
  • 打赏
  • 举报
回复
1.保证你http流媒体地址可以在电脑浏览器上打开
2.流媒体有http和rtsp,setDataSource是可以直接传url的,但是流媒体准备阶段比较耗时,不能直接在prepare之后调用start函数,需要给meidplayer注册OnPreparedListener函数。在onPrepared函数中才能调用start函数。
你类头comment里面也有写的,但却没有这么做。
qdkfriend 2012-05-10
  • 打赏
  • 举报
回复


这东西主要是你需要一台支持RTSP的服务器来存放网络视频资源
客户端连接对应的地址就可以了
http://blog.csdn.net/kepoon/article/details/6772060
jain113 2012-05-10
  • 打赏
  • 举报
回复
那我这里要播放网络视频应该怎么弄啊?
告诉我下实现方案吗? 谢谢了!

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧