简单的说下一Android的几种视频播放功能:
1、VideoView:最简单的视频播放
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.HotFragment">
<VideoView
android:id="@+id/vv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
private void initView(View v) {
VideoView videoView = v.findViewById(R.id.vv);
String uri="/storage/emulated/0/Download/APPNEWCARDEMO.mp4";
videoView.setVideoPath(uri);
videoView.start();
}
VideoView全屏:
public class SplashVideoView extends VideoView {
public SplashVideoView(Context context) {
super(context);
}
public SplashVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SplashVideoView(Context context, AttributeSet attrs, int
defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int
heightMeasureSpec) {
//我们重新计算高度
int width = getDefaultSize(0, widthMeasureSpec);
int height = getDefaultSize(0, heightMeasureSpec);
setMeasuredDimension(width, height);
}
@Override
public void
setOnPreparedListener(MediaPlayer.OnPreparedListener l) {
super.setOnPreparedListener(l);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
}
2、SurfaceView+MediaPlayer 播放视频:使用方式
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
private SurfaceView surfaceView;
private MediaPlayer player;
private SurfaceHolder holder;
private void initView2(View v) {
surfaceView = v.findViewById(R.id.surfaceView);
String uri="/storage/emulated/0/Download/APPNEWCARDEMO.mp4";
player = new MediaPlayer();
try {
player.setDataSource(uri);
holder=surfaceView.getHolder();
holder.addCallback(new MyCallBack());
try {
player.prepare();
} catch (IOException e) {
e.printStackTrace();
}
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
player.start();
player.setLooping(true);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private class MyCallBack implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
player.setDisplay(holder);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
3、TextureView+MediaPlaye 播放视频:使用方式;
<TextureView
android:id="@+id/textureView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
private TextureView textureView;
private MediaPlayer player;
private void initView(View v) {
textureView = v.findViewById(R.id.textureView);
String uri="/storage/emulated/0/Download/APPNEWCARDEMO.mp4";
player = new MediaPlayer();
try {
player.setDataSource(uri);
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
player.setSurface(new Surface(surfaceTexture));
try {
player.prepare();
} catch (IOException e) {
e.printStackTrace();
}
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
player.start();
player.setLooping(true);
}
});
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
以上是Android基本的视频播放方式,有什么不同我就先不介绍了,看项目需要;
下面介绍几种主流的视频开源项目:
1、ExoPlyer 谷歌的开源框架,使用方式:
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
private void initializePlayer(View v) {
playerView = (v.findViewById(R.id.video_view));
// 创建带宽
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
// 创建轨道选择工厂
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
// 创建轨道选择实例
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
// 创建播放器实例
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(getActivity(), trackSelector);
playerView.setPlayer(player);
// 创建加载数据的工厂
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(getActivity(), Util.getUserAgent(getActivity(), "MyApplication"), null);
// 创建资源
Uri uri = Uri.parse("/storage/emulated/0/Download/APPNEWCARDEMO.mp4");
ExtractorMediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
player.prepare(mediaSource, false, true);
player.setPlayWhenReady(true);
}
ExoPlayer项目地址:https://github.com/google/ExoPlayer
2、JiaoZiVideoPlayer 视频播放、使用方式;
<cn.jzvd.JzvdStd
android:id="@+id/videoplayer"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
JzvdStd jzvdStd = (JzvdStd) findViewById(R.id.videoplayer);
jzvdStd.setUp("http://jzvd.nathen.cn/c6e3dc12a1154626b3476d9bf3bd7266/6b56c5f0dc31428083757a45764763b0-5287d2089db37e62345123a1be272f8b.mp4"
, "视频标题", Jzvd.SCREEN_WINDOW_NORMAL);
jzvdStd.thumbImageView.setImage("http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640"); //占位图
饺子饺子播放器开源地址:https://github.com/lipangit/JiaoZiVideoPlayer
3、ijkplayer
哔哩哔哩开源项目:https://github.com/bilibili/ijkplayer
Android几种视频播放方式,VideoView、SurfaceView+MediaPlayer、TextureView+MediaPlayer,以及主流视频播放器开源项目的更多相关文章
-
GitHub上最著名的Android播放器开源项目大全
GitHub上最著名的Android播放器开源项目大全 ...
-
android 三种定位方式
http://www.cnblogs.com/oudi/archive/2012/03/22/2411509.html 最近在看android关于定位的方式,查了很多资料,也做了相关实验,在手机上做了 ...
-
github上十二款最著名的Android播放器开源项目
1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...
-
Android 五种存储方式个人总结
一 . 文件存储 FileOutputStream out = openFileOutput("data",Context.MODE_PRIVATE); BufferedWrite ...
-
Android四种布局方式
线性布局 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap ...
-
android五种存储方式
http://www.cnblogs.com/smalltigerlee/archive/2011/11/10/2244143.html
-
[android] 两种异步方式
使用AsyncTask开启子线程获取服务器数据,更新界面UI /** * 异步任务 * * @author taoshihan * */ public class HttpAsyncTask exte ...
-
Android MediaPlayer架构 -- MediaPlayer的创建过程
本文系作者自己学习之所用,文章内容仅出自作者拙劣之思考,问题之处烦请不吝指教. MediaPlayer 能被用来控制音/视频文件或流媒体的回放.Android中以MediaPlayer类作为音视频播放 ...
-
以下三种下载方式有什么不同?如何用python模拟下载器下载?
问题始于一个链接https://i1.pixiv.net/img-zip-...这个链接在浏览器打开,会直接下载一个不完整的zip文件 但是,使用下载器下载却是完整文件 而当我尝试使用python下载 ...
随机推荐
-
ASP.NET是否存在客户端控件?
在很久很久以前,传说...在ASP.NET开发中,使用服务端控件,比客户端控件更加损耗性能... 那么ASP.NET中是否有客户端控件呢? 有些人就说了,打开VS,然后在左边,工具箱里,有个HTML部 ...
-
javascript eval 执行过程
当执行eval时,会执行如下过程 eval(x): 1.如果 x的类型不是string,那么会return x; 2.把x转换成 ecmascript 代码.如果转换失败,责抛出SyntaxError ...
-
知识树杂谈Android面试(3)
一.Activity生命周期? a. Activity四种状态? Running.Paused(透明无焦点).Stopped.killed. b. OnStart() OnRusume区分? 是否可以 ...
-
AX视图View中添加静态方法
public static server str EcoResCategoryName(){ DictView dv = new DictView(tableNum("ViewNam ...
-
python之路(四)-set集合
set集合 set是一个无序且不重复的元素集合优点:访问速度快,解决重复问题 l1 = [1,2,34,5,6,7,4,3,3,] s2 = set(l1) #可以以列表元祖等作为参数传进来,set集 ...
-
DBCHART直方图顶端显示数字
双击DBCHART-->选SERIES选项卡-->选MARKS-->选STYLE值为VALUE
-
视图,sql注入问题,事物,存储过程
视图:本质是一张虚拟的表数据来自select语句用途是保障原表安全 功能1:隐藏部分数据,开放指定数据功能2:因为视图可以将查询结果保存的特性,我们可以用视图来达到减少书写sql语句的功能 例如:se ...
-
C#与java中的AES加解密互解算法
一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...
-
ARM Cortex Design Considerations for Debug
JTAG was the traditional mechanism for debug connections for ARM7/9 parts, but with the Cortex-M fam ...
-
Pinpoint - 应用性能管理(APM)平台实践之部署篇
0.0 前言 国内的APM行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的APM企业,例如APPdynamic,Dynamic,NewRelic ...