上一篇博客中,使用SurfaceView和MediaPlayer完成了视频播放,当然安卓原生控件中的VideoView也可以实现网络视频与本地视频的播放,非常简单,仔细查看源码,会发现VideoView的底层正式使用了MediaPlayer与SurfaceView封装创建。但是在列表播放时,使用VideoView控件占据内存很大,很容易造成oom的错误。但是使用SurfaceView和MediaPlayer,我们发现很麻烦,而且功能比较少,所以我们选择使用封装好的第三方框架完成视频播放的操作,这里为大家推荐一种功能齐全使用简单的视频框架——JiaoZiVideoPlayer,点击跳转github链接。
- 可以完全自定义UI和任何功能
- 一行代码切换播放引擎,支持的视频格式和协议取决于播放引擎,android.media.MediaPlayer ijkplayer
- 完美检测列表滑动
- 可实现全屏播放,小窗播放
- 能在
ListView
、ViewPager
和ListView
、ViewPager
和Fragment
等多重嵌套模式下全屏工作- 可以在加载、暂停、播放等各种状态中正常进入全屏和退出全屏
- 多种视频适配屏幕的方式,可铺满全屏,可以全屏剪裁
- 重力感应自动进入全屏
- 全屏后手势修改进度和音量
- Home键退出界面暂停播放,返回界面继续播放
- WebView嵌套本地视频控件
- demo中添加视频缓存的例子
- 倍速播放
这里我主要使用此播放器完成上一篇博客中的列表播放的效果,鉴于网址内容可能会发生变化,为了能长久使用,我将视频播放相关数据保存在集合中,封装类如下:
package com.animee.videodemo;
public class VideoBean {
private String title;
private String picUrl;
private String videoUrl;
public VideoBean() {}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getVideoUrl() {
return videoUrl;
}
public void setVideoUrl(String videoUrl) {
this.videoUrl = videoUrl;
}
public VideoBean(String title, String picUrl, String videoUrl) {
this.title = title;
this.picUrl = picUrl;
this.videoUrl = videoUrl;
}
}
集合类:
package com.animee.videodemo;
import java.util.ArrayList;
import java.util.List;
public class ContentDatas {
public static ListgetVideoList(){
ListmDatas = new ArrayList<>();
VideoBean vb1 = new VideoBean("爸爸智力只有7岁,生下个女儿却是个天才,从头哭到尾的催泪神作", "http://qiubai-video.qiushibaike.com/P1I6OWEZRYV31Z6Y_hd.jpg", "http://qiubai-video.qiushibaike.com/P1I6OWEZRYV31Z6Y_hd_3g.mp4");
VideoBean vb2 = new VideoBean("妹子撞车求乡民围观:「嘤嘤嘤~有人这样进便利店的嘛,哥」", "http://qiubai-video.qiushibaike.com/VHXH6U0MOQZBX2AB_hd.jpg", "http://qiubai-video.qiushibaike.com/VHXH6U0MOQZBX2AB_hd_3g.mp4");
VideoBean vb3 = new VideoBean("他太牛逼了", "http://qiubai-video.qiushibaike.com/2J77BRHL2MWT1QI0_hd.jpg", "http://qiubai-video.qiushibaike.com/2J77BRHL2MWT1QI0_hd_3g.mp4");
VideoBean vb4 = new VideoBean("来自老阿姨的深深羡慕……", "http://qiubai-video.qiushibaike.com/SX4GS7D1HSIRLB93_hd.jpg", "http://qiubai-video.qiushibaike.com/SX4GS7D1HSIRLB93_hd.mp4");
VideoBean vb5 = new VideoBean("男:怎么感觉背后一股凉意?", "http://qiubai-video.qiushibaike.com/Q54WZ4CQLXGTEETJ_hd.jpg", "http://qiubai-video.qiushibaike.com/Q54WZ4CQLXGTEETJ_hd.mp4");
VideoBean vb6 = new VideoBean("拉郎配,当wuli坤坤遇到大哥声线。律师函警告", "http://qiubai-video.qiushibaike.com/75EH5FHSCONW1I2S_hd.jpg", "http://qiubai-video.qiushibaike.com/75EH5FHSCONW1I2S_hd.mp4");
VideoBean vb7 = new VideoBean("打人可以领钱? 我也想试试", "http://qiubai-video.qiushibaike.com/96O8WH8DVHDN0C2B_hd.jpg", "http://qiubai-video.qiushibaike.com/96O8WH8DVHDN0C2B_hd.mp4");
VideoBean vb8 = new VideoBean("公交车上的林黛玉,超市里的穆桂英!", "http://qiubai-video.qiushibaike.com/658LMRR3Z4K6WLG7_hd.jpg", "http://qiubai-video.qiushibaike.com/658LMRR3Z4K6WLG7_hd.mp4");
VideoBean vb9 = new VideoBean("比一比谁有我的胆子大?", "http://qiubai-video.qiushibaike.com/VF6VO3EYBX1MVAOF_hd.jpg", "http://qiubai-video.qiushibaike.com/VF6VO3EYBX1MVAOF_hd.mp4");
VideoBean vb10 = new VideoBean("儿子要我买玩具,这个我买不了咋办?", "http://qiubai-video.qiushibaike.com/L2K70DVTL31ES4HM_hd.jpg", "http://qiubai-video.qiushibaike.com/L2K70DVTL31ES4HM_hd.mp4");
VideoBean vb11 = new VideoBean("中国体育比赛十大逆转经典", "http://qiubai-video.qiushibaike.com/DI954R31TIWECWU3_hd.jpg", "http://qiubai-video.qiushibaike.com/DI954R31TIWECWU3_hd.mp4");
VideoBean vb12 = new VideoBean("气质这一块,大爷们拿捏的死死的","http://qiubai-video.qiushibaike.com/0552P62DDFAX8V4U_hd.jpg","http://qiubai-video.qiushibaike.com/0552P62DDFAX8V4U_hd.mp4");
mDatas.add(vb1);
mDatas.add(vb2);
mDatas.add(vb3);
mDatas.add(vb4);
mDatas.add(vb5);
mDatas.add(vb6);
mDatas.add(vb7);
mDatas.add(vb8);
mDatas.add(vb9);
mDatas.add(vb10);
mDatas.add(vb11);
mDatas.add(vb12);
return mDatas;
}
}
接下来,我在res/layout文件夹下绘制布局。
activity_notify.xml
item_video.xml
接下来完成listview的适配器的编写:
package com.animee.videodemo;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.squareup.picasso.Picasso;
import java.util.List;
import cn.jzvd.JzvdStd;
public class VideoAdapter extends BaseAdapter {
Context context;
ListmDatas;
public VideoAdapter(Context context, List mDatas) {
this.context = context;
this.mDatas = mDatas;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_video,null);
holder = new ViewHolder();
holder.jzvdStd = convertView.findViewById(R.id.jz_video);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
VideoBean videoBean = mDatas.get(position);
// 设置视频播放地址和视频标题
holder.jzvdStd.setUp(videoBean.getVideoUrl(),videoBean.getTitle(), JzvdStd.SCREEN_FULLSCREEN);
// 设置视频缩率图
Picasso.with(context).load(videoBean.getPicUrl()).into(holder.jzvdStd.thumbImageView);
// 设置正在播放位置
holder.jzvdStd.positionInList = position;
return convertView;
}
class ViewHolder{
JzvdStd jzvdStd;
}
}
NotifyActivity对应编码为:
package com.animee.videodemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.List;
public class NotifyActivity extends AppCompatActivity {
ListView lv;
private VideoAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notify);
lv = findViewById(R.id.video_lv);
List videoList = ContentDatas.getVideoList();
adapter = new VideoAdapter(this, videoList);
lv.setAdapter(adapter);
}
}
最后要记得在AndroidManifest.xml添加网络权限
在当前app的build.gradle文件中,添加依赖等内容:
然后运行一下,就可以实现视频播放列表效果了~
好了,关于JiaoZiVideoPlayer的使用,就介绍到这里,如果大家有兴趣,可以查看github上面的demo,进一步探索,感谢您的阅读!