Android之视频播放

VideoView

if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){   //判断SDCard是否存在
     SDExit = true;
} else{
     SDExit = false;
     Toast.makeText(VideoActivity.this, "SD卡不存在!", Toast.LENGTH_SHORT).show();
}

public class VideoActivity extends Activity{
    private VideoView videoView;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.video);
        videoView=(VideoView)findViewById(R.id.video);
        String videoPath = "file:///sdcard/video/he.mp4";
        videoView.setVideoURI(Uri.parse(videoPath));
        videoView.setMediaController(new MediaController(this));// 设置播放器的控制条
        videoView.requestFocus();
        videoView.start(); // 开始播放视频
    }
}

<!-- VideoView - 视频播放控件-->
<VideoView android:id="@+id/video" android:layout_width="fill_parent"
    android:layout_height="360dp" />

MediaPlayer

<SurfaceView
    android:id="@+id/surface"
    android:layout_width="match_parent"
    android:layout_height="360dp" > </SurfaceView>

public class VideoActivity extends Activity implements OnBufferingUpdateListener, OnCompletionListener,
    OnPreparedListener,OnVideoSizeChangedListener, SurfaceHolder.Callback{

private MediaPlayer mediaPlayer;
    private SurfaceView surfaceView;
    private SurfaceHolder holder;
    private Bundle bundle;
    private String videoPath;
    private int mVideoWidth, mVideoHeight;
    private static final String MEDIA = "media";
    private static final int LOCAL_AUDIO = 1, STREAM_AUDIO = 2, RESOURCES_AUDIO = 3, LOCAL_VIDEO = 4, STREAM_VIDEO = 5;
    private boolean isVideoSizeKnown = false, isVideoReadyToBePlayed = false;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.video);

surfaceView = (SurfaceView) findViewById(R.id.surface);
        holder = surfaceView.getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        bundle = getIntent().getExtras();
        private void playVideo(){ //播放视频
        cleanUp();
        try {
            videoPath = "file:///sdcard/video/he.mp4";
            //videoPath = "http://192.168.0.180:8080/?action=stream";
            if(videoPath == ""){
                Toast.makeText(VideoActivity.this, "视频路径不正确!", Toast.LENGTH_SHORT).show();
            }
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setDataSource(videoPath);
            mediaPlayer.setDisplay(holder);
            mediaPlayer.prepare();
            mediaPlayer.setOnBufferingUpdateListener(this);
            mediaPlayer.setOnCompletionListener(this);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setOnVideoSizeChangedListener(this);
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }catch (Exception e) {
        }
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        playVideo();
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
    @Override
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
        if (width == 0 || height == 0) {
            return ;
        }
        isVideoSizeKnown = true;
        mVideoWidth = width;
        mVideoHeight = height;
        if (isVideoReadyToBePlayed && isVideoSizeKnown) {
            startVideoPlayback();
        }
    }
    @Override
    public void onPrepared(MediaPlayer mp) {
        isVideoReadyToBePlayed = true;
        if (isVideoReadyToBePlayed && isVideoSizeKnown) {
            startVideoPlayback();
        }
    }
    @Override
    public void onCompletion(MediaPlayer mp) {
    }
    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
    }
    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaPlayer();
        cleanUp();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseMediaPlayer();
        cleanUp();
    }
    private void releaseMediaPlayer() {
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }
    private void cleanUp() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        isVideoReadyToBePlayed = false;
        isVideoSizeKnown = false;
    }
    private void startVideoPlayback() {
        holder.setFixedSize(mVideoWidth, mVideoHeight);
        mediaPlayer.start();
    }
}

官网参考链接:http://developer.android.com/reference/android/media/MediaPlayer.html

参考链接:

代码下载示例:http://download.csdn.net/detail/klcf0220/5999561

Android:视频(VideoView/MediaPlayer)的更多相关文章

  1. android 随手记 videoview循环播放网络视频 和mediaplayer+sufaceview播放网络视频

    1:videoview循环播放视频 1>xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res ...

  2. Android视频媒体相关,VideoView和开源框架vitamio

    虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,但是Vitamio的确强大到没朋友! Vitamio 是一款 An ...

  3. Android使用VideoView播放本地视频及网络视频Demo

    1.xm文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...

  4. Android使用VideoView播放网络视频

    Android支持播放网络上的视频.在播放网络上的视频时,牵涉到视频流的传输,往往有两种协议,一种是HTTP,一种是RTSP.这 两种协议最大的不同是,HTTP协议,不支持实时流媒体的播放,而RTSP ...

  5. android采用videoView播放视频(包装)

    //android播放视频.用法:于androidManifest.xml添加activity, // <activity android:name=".PlayVideo" ...

  6. android中VideoView播放sd卡上面的视频

    (1)videoView组件只支持MP4和3gp格式的视屏播放,如果想播放其它视屏格式的文件,还得开发能够播放的视屏播放器 (2)videoView组件功能比较单一,如果想开发功能丰富的播放器,还得重 ...

  7. Android下VideoView的研究

    VideoView继承自SurfaceView,实现了MediaController.MediaPlayerControl的接口.在android系统中的包名为android.widget.Video ...

  8. android之VideoView和视频播放View的扩展

    1.概念及扩展 VideoView 是android 系统提供的一个媒体播放显示和控制的控件.其结构层次如下: 原型:VideoView extends SurfaceView implements  ...

  9. android 视频开发2分之2(仿美拍,糗百)

    上一篇写了分段录制和合并视频.这一篇则是选择视频,然后截断视频. 1.从sdcard中找到视频资源: 2.分析视频,拿到你须要的帧数当你的图片.(我的是依据參数来算的多少秒1帧的图片,通常是1秒1帧来 ...

随机推荐

  1. P1856 矩形周长

    哇!这小破题坑了我好久. 扫描线+线段树 这题数据范围小,没离散化.真要离散化我还搞不好呢. 具体的看这个博客吧. 主要是这个坑爹的c,len把我搞了,其他的还好. 代码: #include < ...

  2. 解决invalid record found in VCF4 file (at least 8 tab-delimited fields expected)问题,批量修改空格改为制表格格式

    出现这种问题说明一般存在两个问题: 第一,vcf文件不足8个分割制表符,比如像如下文件: 为了解决这个问题,说明在做snp filter时候,需要提取至少8个制表符的字符串,比如,像如下文件所示: 第 ...

  3. poj 3276(反转)

    传送门:Problem 3276 参考资料: [1]:挑战程序设计竞赛 先献上AC代码,题解晚上再补 题意: John有N头牛,这些牛有的头朝前("F"),有的朝后("B ...

  4. java生成二维码(最初版)

    研究了2个小时,发现自己竟然智障,用原先的图片覆盖另一个图片 package com.tz.util; import java.awt.Color;import java.awt.Graphics2D ...

  5. P2885 [USACO07NOV]电话线Telephone Wire

    P2885 [USACO07NOV]电话线Telephone Wire 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话 ...

  6. 配置GitLab Push 自动触发Jenkins构建

    配置GitLab Push 自动触发Jenkins构建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客是对之前的笔记:https://www.cnblogs.com/yin ...

  7. 使用cpanm安装perl相关模块

    cpanm是安装Perl模块的最方便的方法.自动下载安装依赖包.使用CPAN shell或下载源码包安装模块,遇到大量依赖关系,非常头痛.下面就是一例: 1. 安装cpanmcpanm其实是一个可执行 ...

  8. Log4net(三)——RollingFileAppender配置

    RollingFileAppender配置 log4net的记录介质很多,这里只总结最常用的方式之一:RollingFileAppender. 1.日志文件名是以文件大小进行变换的 如果日志文件大小到 ...

  9. HDU - 3006 The Number of set(状态压缩位运算)

    http://acm.hdu.edu.cn/showproblem.php?pid=3006 题意 给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.问由给出的集合可以组成多少 ...

  10. Linux 命令详解(十)Shell脚本的数组详解

    1.数组定义 [root@bastion-IDC ~]# a=( ) [root@bastion-IDC ~]# echo $a 一对括号表示是数组,数组元素用“空格”符号分割开. 2.数组读取与赋值 ...