视频播放和音频播放一样,都是使用MediaPlayer来播放的,区别就是MediaPlayer播放视频时是直接在Activity中实现的,而音频播放则需要写到服务中去。使用MediaPlayer只支持MP4和3gp格式的文件,如果想要播放其他格式的文件需要使用第三方库,这里推荐使用vitamio

MediaPlayer


使用MediaPlayer类来播放视频文件

布局文件


在布局文件中使用了SurfaceView控件来显示视频,该控件是为显示视频而生的。SurfaceView有一个很不好的特性就是。当Activity变为后台时该对象会被直接销毁,而Activity切换到前台时该对象会重新被创建。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <SurfaceView
android:id="@+id/player"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

Activity


在Activity中获取SuerfaceView对象,创建MediaPlayer对象,进行一些设置后调用mp.setDisplay()方法就可以通过SurfaceView对象来显示视频。由于构建SuerfaceView对象比较耗时,所以播放的设置应该放置在其构建完成后的回调函数中去。SurfaceView对象被销毁后会调用surfaceDestroyed方法

package xidian.dy.com.chujia;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView; import java.io.IOException; public class MainActivity extends AppCompatActivity {
MediaPlayer mp;
int current;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SurfaceView sv = (SurfaceView) findViewById(R.id.player);
SurfaceHolder sh = sv.getHolder(); sh.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(mp == null){
mp = new MediaPlayer();
mp.reset();
try {
mp.setDataSource("/sdcard/a.mp4");
mp.setDisplay(holder);
mp.prepare();
mp.start();
mp.seekTo(current);
} catch (IOException e) {
e.printStackTrace();
}
}
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mp != null){
current = mp.getCurrentPosition();
mp.stop();
mp.release();
mp=null;
}
}
});
}
}

还有一个API叫VideoView,也可以通过他来进行视频的播放,VideoView只是将MediaPlayer和SurfaceView结合起来而已,并没有做过多的扩展。由于这两个API支持的视频格式有限,所以在开发中用的很少。

Vitamio


这是一个第三方的开源框架,github地址https://github.com/yixia/VitamioBundle

在AS下的导入Vitamio方式:http://www.cnblogs.com/happyhacking/p/5365192.html

布局文件


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<io.vov.vitamio.widget.VideoView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/vv"/>
</LinearLayout>

Activity


package xidian.dy.com.chujia;

import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; import java.io.File; import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView; public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))
return;
VideoView vv = (VideoView) findViewById(R.id.vv);
File f = new File(Environment.getExternalStorageDirectory(), "a.avi");
Log.e("path", f.getPath());
if(vv != null){
vv.setVideoPath(f.getPath());
vv.start();
vv.setMediaController(new MediaController(this));
}
}
}

清单文件


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xidian.dy.com.chujia">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="主界面">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="io.vov.vitamio.activity.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" />
</application>
</manifest>

android之视频播放的更多相关文章

  1. Android 多媒体视频播放一( 多媒体理解与经验分享)

    前言 说到android的多媒体,一把辛酸一把泪,当初听说会多媒体的比较牛掰,公司也有需求,于是乎我也积极的加入研究android多媒体的行列,记得以前刚接触的时候,最开始还是比较头大的,主要是但是很 ...

  2. Android本地视频播放器开发--视频解码

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

  3. 怎样在Android本地视频播放器开发

    在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...

  4. Unity实现Android端视频播放

    本文只讲Android短的视频播放 实现方式 使用Handheld.PlayFullScreenMovie(),这个函数实现.具体如下: 1.创建StreamingAssets文件夹,此文件夹放入视频 ...

  5. Android本地视频播放器开发--简易播放器原型

    在以前的基础上,将音视频进行合并,音频播放采用OpenSL ES,视频播放采用OpenGL ES2.0进行显示,这次的版本其中音频和视频是在同一个线程,会造成音频断断续续,后续会采用音频使用SDL,视 ...

  6. Android [VP]视频播放器播放本地视频时收到短信/彩信,需要界面提示 M

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  7. android之视频播放系统VideoView和自定义VideoView控件的应用

    Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频. 1:自定义VideoView控件 2:布局代码 3:Activi ...

  8. android -------- VideoCache 视频播放(缓存视频到本地)

    先前做了一个小视频的功能,里面有播放多个视频的功能,为了效率,我加了视频缓存功能: 一方面耗费用户的流量,另一方面直接从本地播放要更流畅 网上看资料,一个视频缓存库,使用起来很方便,还不错,就分享给大 ...

  9. Android 网络视频播放器

    项目概要: 1.登录界面 2.播放列表 3.播放界面

随机推荐

  1. Swift方法实现回调的一种方式

    记录一下: 封装了一个类,暴露出的一个方法,在外部引用时,给出回调blcok 封装类: //MARK:登录 public func loginWithToken(token:String,loginS ...

  2. 《C陷阱与缺陷》之1词法"陷阱"

    编译器中负责将程序分解为一个一个符号的部分,一般称为"词法分析器".在C语言中,符号之间的空白(包括空格符.制表符或换行符)将被忽略. 1.=不同于== C语言使用符号" ...

  3. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...

  4. PCIe 32GT/s 含义

    如下: Jul 26 03:42:53 kernel: ixgbe 0000:01:00.1: PCI Express bandwidth of 32GT/s available Jul 26 03: ...

  5. 贤者时间太久了么?--MySQL继续玩

    hi 给自己放了大概三天的假,没有一点点防备,没有一点点准备,无意的 是不是贤者时间过不去了我不知道啊...继续看东西吧 1.MySQL -----运算符和函数----- 字符函数,数值运算符,比较运 ...

  6. 30 algorithm questions study

    April 26, 2015 Spent over a few months to go over 30 questions about algorithm starting from January ...

  7. cuda fft 计算

    #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...

  8. 【2016-10-14】【坚持学习】【Day5】【策略模式】

    今天学了策略模式 例子 一个售票系统,针对不同的用户使用不用的计价方式, 环境类:一个业务场景(电影票累,) 抽象类:计价算法 具体实现类:5折算法,满100减20算法,..... 抽象策略类 abs ...

  9. GTAC 2015将于11月10号和11号召开

    今年的GTAC注册已经结束,将会在11月10号和11号在Google马萨诸塞州剑桥办公室召开.大家可以关注https://developers.google.com/google-test-autom ...

  10. poj[1185]炮兵阵地

    Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...