首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android 播放网络视频! 急解决方案

2012-05-14 
android 播放网络视频!急!!!!Java codepackage com.cnimport android.app.Activityimport android.media

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

Java code
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




这样的错啊? 但在播放本地视频时又能正常播放? 希望有高手解答!!!!

[解决办法]


这东西主要是你需要一台支持RTSP的服务器来存放网络视频资源
客户端连接对应的地址就可以了
http://blog.csdn.net/kepoon/article/details/6772060
[解决办法]
1.保证你http流媒体地址可以在电脑浏览器上打开
2.流媒体有http和rtsp,setDataSource是可以直接传url的,但是流媒体准备阶段比较耗时,不能直接在prepare之后调用start函数,需要给meidplayer注册OnPreparedListener函数。在onPrepared函数中才能调用start函数。
你类头comment里面也有写的,但却没有这么做。

热点排行