android之视频播放
视频播放和音频播放一样,都是使用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之视频播放的更多相关文章
- Android 多媒体视频播放一( 多媒体理解与经验分享)
前言 说到android的多媒体,一把辛酸一把泪,当初听说会多媒体的比较牛掰,公司也有需求,于是乎我也积极的加入研究android多媒体的行列,记得以前刚接触的时候,最开始还是比较头大的,主要是但是很 ...
- Android本地视频播放器开发--视频解码
在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...
- 怎样在Android本地视频播放器开发
在上一章Android本地视频播放器开发--SDL编译编译中编译出sdl的支持库,当时我们使用的2.0,但是有些api被更改了,所以在以下的使用者中我们使用SDL1.3的库,这个库我会传上源码以及编译 ...
- Unity实现Android端视频播放
本文只讲Android短的视频播放 实现方式 使用Handheld.PlayFullScreenMovie(),这个函数实现.具体如下: 1.创建StreamingAssets文件夹,此文件夹放入视频 ...
- Android本地视频播放器开发--简易播放器原型
在以前的基础上,将音视频进行合并,音频播放采用OpenSL ES,视频播放采用OpenGL ES2.0进行显示,这次的版本其中音频和视频是在同一个线程,会造成音频断断续续,后续会采用音频使用SDL,视 ...
- Android [VP]视频播放器播放本地视频时收到短信/彩信,需要界面提示 M
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- android之视频播放系统VideoView和自定义VideoView控件的应用
Android播放视频,包含系统自带VideoView控件,和自定义VideoView控件,可全屏播放,案例包含了本地视频和网络视频. 1:自定义VideoView控件 2:布局代码 3:Activi ...
- android -------- VideoCache 视频播放(缓存视频到本地)
先前做了一个小视频的功能,里面有播放多个视频的功能,为了效率,我加了视频缓存功能: 一方面耗费用户的流量,另一方面直接从本地播放要更流畅 网上看资料,一个视频缓存库,使用起来很方便,还不错,就分享给大 ...
- Android 网络视频播放器
项目概要: 1.登录界面 2.播放列表 3.播放界面
随机推荐
- 常用的js跳转页面方法实现汇总
1.window.location.href方式 <script language="javascript" type="text/javascript" ...
- 烂泥:nginx负载均衡
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天我们来学习下有关nginx的负载均衡配置.nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的. 说明: ...
- 图灵机器人(问答机器人)API调用示例
问答机器人API文档:https://www.juhe.cn/docs/api/id/112 先上图: 说下大致实现的步骤: 1.首先使用了聚合数据的sdk,这样免费使用的数目可以多一些 2.使用gs ...
- C# WebService URL重写
背景 有时候我们会有这样的需求,将 WebService URL 中的 asmx 后缀去掉:或者我们要模拟普通 Web 的 URL,接口名称直接拼接在 URL 中.这些情况我们都要用到URL重写. 关 ...
- git 学习使用总结三(远程仓库操作)
这篇文章仅供自己以后翻阅加深记忆,要系统的学习 git 教程(中文版),请移步到 liaoxuefeng.com 学习 git 教程部分. pull, fetch, clone, push, chec ...
- Use getopt() & getopt_long() to Parse Arguments
Today I came across a function [getopt] by accident. It is very useful to parse command-line argumen ...
- C#迭代重载等
迭代器 迭代器是作为一个容器,将要遍历的数据放入,通过统一的接口返回相同类型的值 迭代器代码使用 yield return 语句依次返回每个元素.yield break 将终止迭代 类中实现多个迭代器 ...
- POJ1155TELE[树形背包]
TELE Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4957 Accepted: 2726 Description ...
- jmeter-HTTP COOKIE Manager
http://wangsheng14591.blog.163.com/blog/static/327797102012829101351887/
- python画柱状图并且输出到html文件
import matplotlibmatplotlib.use('Agg')import matplotlib.pyplot as pltfrom Cstring import StringIO y ...