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

Posted 无名之辈之码谷娃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓基于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开发起来还是有一定的基础,都是变通的。迎难而上。

jiecaovideoplayer

1.简介

其是一个很强大的视频制造工具。 类似效果图如下:

 

2.简单用法

1)集成jcvideoplayer-lib

2)引用fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard组件

3)最后加载要播放视频的路径,图片的路径,视频的标题等

 

3.在该基础上再自定义效果

核心:继承JCVideoPlayer来进行自定义

 

4.使用webview来使用该组件

1)写好JCCallBack 类,其是在html文件中进行使用的一个监听类,并在这边利用我们的简单用法来选择播放视频的路径,图片,标题和视频的大小等。

2)在html中利用这个类进行赋值,播放

以上是关于安卓基于JCVideoPlayer 播放视频(本地网络),基于java计数器实现视频轮播的主要内容,如果未能解决你的问题,请参考以下文章

2018-05-20 安卓使用vlc播放本地视频

有趣的安卓视频播放器(VideoView)

安卓liveplayer是干嘛的

video-js无法播放本地视频

安卓微信与苹果微信的区别?

基于树莓派4B设计的音视频播放器(从0开始)