安卓基于JCVideoPlayer 播放视频(本地网络),基于java计数器实现视频轮播

JCVideoPlayer 是一款开源的播放器

 

如果通过控件播放网络视频和本地视频?

代码很简单:

 JCVideoPlayer.toFullscreenActivity(this,
                "http://vfx.mtime.cn/Video/2019/03/09/mp4/190309153658147087.mp4",
                "http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640",
                "简单代码实现视频播放");

一行代码搞定视频播放。

我们的需求实现:

1,视频支持离线播放,

2,视频播放最新视频。

3,视频支持视频轮播。

视频下载播放?

1,获取当前sdk卡的缓存目录,然后把视频通过file文件流下载到磁盘当中。

2,下载视频需要注意网络问题,下载视频是无法播放的。

    static public void getCreateVidioDir() {
        try {
            String bufferDir = Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + "/videos/files";
            new File(bufferDir).mkdirs();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

初始化视频,通过java程序实现轮播。

  /**
     * 初始化视频数据
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    public static void initVideoList() throws Exception {
         File file = new File(filePath);
         if(file.list() == null || file.list().length ==0 ){
             return;
         }
         List<String>  list =  Arrays.asList(file.list());
        Collections.sort(list);
        System.out.println(list);
        //再反转
        Collections.reverse(list);
        Map<Integer, VideoEachPlayUtlis.VideoParms> videoParmsMap = new LinkedHashMap<>();
        String defulatThumb ="http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640";
        //排序获取最大的下标开始
        for(int i =0 ; i<list.size(); i++){
            int index = list.size()-i;
            String videoUrl = list.get(i);
            videoParmsMap.put(index, new VideoEachPlayUtlis.VideoParms(videoUrl
                    , defulatThumb, "测试-标题---"+index));
        }

         VideoEachPlayUtlis.setVideoParmsMap(videoParmsMap);
    }

初始化线程池定时线程:

    /**
     * 初始化定时线程
     */
    public void initTaskTherad(){
        ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
        //15分钟下载一次视频
        service.scheduleAtFixedRate(new VedioTask(),15, 15, TimeUnit.MINUTES);
        //30分钟上报一次心跳
        service.scheduleAtFixedRate(new HeartbeatTask(),30, 30, TimeUnit.MINUTES);
    }

通过java程序下标控制视频轮播,初始化视频设置下标,根据下标的增长获取指定视频的下标播放视频:

if (event.type == VideoEvents.POINT_AUTO_COMPLETE_FULLSCREEN) {
            init_count++;
            if (init_count % 2 == 0) {
                init_count = 2;
                if(VideoEachPlayUtlis.getVideoParmsMap().isEmpty()){
                    //播放默认视频
                   return;
                }
                Object[] obj = VideoEachPlayUtlis.getVideoParmsMap().keySet().toArray();
                Arrays.sort(obj);
                Integer key = Integer.valueOf(obj[0].toString());
                nowIndex = nowIndex == null ? initNum : nowIndex - 1;
                if (key == nowIndex) {
                    nowIndex = key;
                } else if (nowIndex < key) {
                    nowIndex = Integer.valueOf(obj[obj.length - 1].toString());
                }
                VideoEachPlayUtlis.VideoParms videoParms = VideoEachPlayUtlis.getVideoParmsMap().get(nowIndex);
                JCVideoPlayer.toFullscreenActivity(this,
                        filePath+videoParms.getUrl(),
                        videoParms.getThumb(),
                        videoParms.getTitle());
            }
package com.ocwvar.video_svg.task;

import android.util.Log;

import com.ocwvar.video_svg.utils.Contans;
import com.ocwvar.video_svg.utils.HttpGetProxy;
import com.ocwvar.video_svg.utils.VideoEachPlayUtlis;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 定时拉取最新视频的线程
 */
public class VedioTask implements Runnable {

    private static volatile int mTargetSize;
    
    String filePath = "/storage/emulated/0/videos/files/";

    public static int getmTargetSize() {
        return mTargetSize;
    }

    public static void setmTargetSize(int mTargetSize) {
        VedioTask.mTargetSize = mTargetSize;
    }

    @Override
    public void run() {
        String url = "http://vfx.mtime.cn/Video/2019/03/09/mp4/190309153658147087.mp4";
        int PREBUFFER_SIZE = 600000;
        HttpGetProxy proxy = new HttpGetProxy(filePath,// 预加载视频文件存放路径
                PREBUFFER_SIZE,// 预加载体积
                100);// 预加载文件上限
        // 设置视频ID
        String id = (System.currentTimeMillis() / 1000) + "";
        try {
            // 开始缓存视频
            download(url,filePath+id);
            File file = new File(filePath + id);
            //判断下载的视频是否存在
            if (file.exists()) {
                Log.i(file.length() + "", VedioTask.getmTargetSize() + "");
                //判断文件大小是否下载成功
                if (file.length() != 0 && file.length() >= VedioTask.getmTargetSize()) {
                    Log.i("视频下载成功", "返回视频状态");
                    swapCache();
                } else {
                    file.delete();
                }


            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 更新轮播视频的状态
     */
    public void swapCache() {
        File file = new File(Contans.filePath);
        List<String> list = Arrays.asList(file.list());
        Collections.sort(list);
        //再反转
        Collections.reverse(list);
        Map<Integer, VideoEachPlayUtlis.VideoParms> sowapCatche = new LinkedHashMap<>();
        String defulatThumb = "http://p.qpic.cn/videoyun/0/2449_43b6f696980311e59ed467f22794e792_1/640";
        for (int i = 0; i < list.size(); i++) {
            int index = list.size() - i;
            String videoUrl = list.get(i);
            sowapCatche.put(index, new VideoEachPlayUtlis.VideoParms(videoUrl
                    , defulatThumb, "测试-标题---" + index));
        }
        Log.i("清除缓存", VideoEachPlayUtlis.getVideoParmsMap().size() + "");
        VideoEachPlayUtlis.getVideoParmsMap().clear();
        Log.i("复制缓存", sowapCatche.size() + "");
        VideoEachPlayUtlis.setVideoParmsMap(sowapCatche);
    }

    private void download(String mUrl, String mPath) throws MalformedURLException {
        // 下载网络文件
        int byteread = 0;
        int mDownloadSize = 0;
        URL url = new URL(mUrl);
        URLConnection conn = null;
        InputStream is = null;
        FileOutputStream os = null;
        try {
            conn = url.openConnection();
            is = conn.getInputStream();
            os = new FileOutputStream(mPath);
            byte[] buffer = new byte[1204];

            int length;

            while ((byteread = is.read(buffer)) != -1) {

                mDownloadSize += byteread;

                //System.out.println(bytesum);

                os.write(buffer, 0, byteread);

            }

            mTargetSize = mDownloadSize;
            Log.i("文件下载成功-------", mPath);
        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {
            VedioTask.setmTargetSize(mTargetSize);
            // 关闭输出流
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 关闭输入流
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }

}

定时下载视频到本地,根据时间戳生成排序。

我们的程序代码就写好了,现在通过模拟器播放视频。

连接到模拟器:adb connect 127.0.0.1:7555 

视频轮播和本地我们已经处理好了。由于安卓就是java写的,所以java开发起来还是有一定的基础,都是变通的。迎难而上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨互联网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值