Android基础课程:第三方视频播放器(播放网络资源)

上一篇博客中,使用SurfaceView和MediaPlayer完成了视频播放,当然安卓原生控件中的VideoView也可以实现网络视频与本地视频的播放,非常简单,仔细查看源码,会发现VideoView的底层正式使用了MediaPlayer与SurfaceView封装创建。但是在列表播放时,使用VideoView控件占据内存很大,很容易造成oom的错误。但是使用SurfaceView和MediaPlayer,我们发现很麻烦,而且功能比较少,所以我们选择使用封装好的第三方框架完成视频播放的操作,这里为大家推荐一种功能齐全使用简单的视频框架——JiaoZiVideoPlayer,点击跳转github链接。

主要特点:

  1. 可以完全自定义UI和任何功能
  2. 一行代码切换播放引擎,支持的视频格式和协议取决于播放引擎,android.media.MediaPlayer ijkplayer
  3. 完美检测列表滑动
  4. 可实现全屏播放,小窗播放
  5. 能在ListViewViewPagerListViewViewPagerFragment等多重嵌套模式下全屏工作
  6. 可以在加载、暂停、播放等各种状态中正常进入全屏和退出全屏
  7. 多种视频适配屏幕的方式,可铺满全屏,可以全屏剪裁
  8. 重力感应自动进入全屏
  9. 全屏后手势修改进度和音量
  10. Home键退出界面暂停播放,返回界面继续播放
  11. WebView嵌套本地视频控件
  12. demo中添加视频缓存的例子
  13. 倍速播放

 这里我主要使用此播放器完成上一篇博客中的列表播放的效果,鉴于网址内容可能会发生变化,为了能长久使用,我将视频播放相关数据保存在集合中,封装类如下:

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文件中,添加依赖等内容:

Android基础课程:第三方视频播放器(播放网络资源)_第1张图片

然后运行一下,就可以实现视频播放列表效果了~

Android基础课程:第三方视频播放器(播放网络资源)_第2张图片

好了,关于JiaoZiVideoPlayer的使用,就介绍到这里,如果大家有兴趣,可以查看github上面的demo,进一步探索,感谢您的阅读!

你可能感兴趣的:(Android学习笔记)