当前位置: 首页 > 工具软件 > VideoCache > 使用案例 >

视频缓存VideoCache

宿景曜
2023-12-01

做Android需要做简单的视频缓存  videocache

首先为依赖包:

 compile 'com.danikula:videocache:2.7.1'

VideoCache工具类

package com.ys.hwpush.videoview;

import android.annotation.SuppressLint;
import android.content.Context;

import com.danikula.videocache.HttpProxyCacheServer;
import com.danikula.videocache.file.FileNameGenerator;
import java.io.File;

/**
 * videocache 本地缓存、播放代理类 Created by liangzhen on 2018/07/30.
 */
public class VideoCacheManager {

    private Context context;

    private HttpProxyCacheServer httpProxyCacheServer;

    @SuppressLint("StaticFieldLeak")
    private static volatile VideoCacheManager videoCacheManager;

    private String feed;

    private VideoCacheManager(Context context){
        this.context = context;
    }

    public static VideoCacheManager getVideoCacheManager(Context context) {
        if (videoCacheManager == null){
            synchronized (VideoCacheManager.class){
                if (videoCacheManager == null){
                    videoCacheManager = new VideoCacheManager(context);
                }
            }
        }
        return videoCacheManager;
    }

    //设置一下ID(用于缓存的名字)
    public VideoCacheManager setFeed(String feed){
        this.feed = feed;
        return this;
    }

    public String getVideoCacheUriDir(){
        String videoCachePath = context.getExternalFilesDir("video_cache").getAbsolutePath();
        makeMultiDirs(videoCachePath);
        return videoCachePath;
    }

    public HttpProxyCacheServer getProxy() {
        if(httpProxyCacheServer == null){
            httpProxyCacheServer = newProxy();
        }
        return httpProxyCacheServer;
    }

    //用于做一些缓存规则
    private HttpProxyCacheServer newProxy() {
        return new HttpProxyCacheServer.Builder(context)
                .cacheDirectory(new File(getVideoCacheUriDir()))
                .maxCacheFilesCount(5)
                .maxCacheSize(1024 * 1024 * 300)
                .fileNameGenerator(new FileNameGenerator() {
                    @Override
                    public String generate(String url) {
                        return feed == null ? "" : feed + ".mp4";
                    }
                })
                .build();
    }


    //创建文件夹
    public static boolean makeMultiDirs(String dirs) {
        boolean mkOK = false;
        File file = new File(dirs);
        if (!file.exists()) {
            mkOK = file.mkdirs();
        }
        return mkOK;
    }

}

Activity的代码模拟

package com.ys.hwpush.videoview;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;

import com.danikula.videocache.HttpProxyCacheServer;
import com.ys.hwpush.R;

import java.util.ArrayList;
import java.util.List;

public class VideoPlayActivity extends AppCompatActivity {

    private VideoCacheManager cacheManager;

    //A是作为下标操作
    private int A=0;

    private List<String> list;
    private VideoView videoView;
    private MediaController controller;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_play);

        list = new ArrayList<>();
        list.add("http://cdn1.cooolar.com/feed_video/2018-04-26/15247317868073.mp4");
        list.add("http://cdn1.cooolar.com/feed_video/2018-02-25/15195224284882.mp4");
        list.add("http://cdn1.cooolar.com/feed_video/2018-04-05/15229203431059.mp4");
        list.add("http://cdn1.cooolar.com/feed_video/2018-03-16/15212035563102.mp4");
        list.add("http://cdn1.cooolar.com/feed_video/2018-03-23/15217943047868.mp4");
        list.add("http://cdn1.cooolar.com/feed_video/2018-04-12/15235107918092.mp4");
        list.add("http://cdn1.cooolar.com/feed_video/2018-03-24/15218702781120.mp4");
        list.add("http://cdn1.cooolar.com/feed_video/2018-03-30/15224013517025.mp4");


        Button up = findViewById(R.id.but_up);
        Button but= findViewById(R.id.but);
        videoView = findViewById(R.id.videoView);

        cacheManager = VideoCacheManager.getVideoCacheManager(this);

        controller = new MediaController(this);

        playVideo(A);

        up.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                A=A-1;
                if(A<0){
                    A=A+1;
                    Toast.makeText(VideoPlayActivity.this,"上面没有视频了",Toast.LENGTH_SHORT).show();
                }else{
                    playVideo(A);
                }
            }
        });

        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                A=A+1;
                if(A>list.size()-1){
                    A=A-1;
                    Toast.makeText(VideoPlayActivity.this,"没有更多视频了",Toast.LENGTH_SHORT).show();
                }else{
                    playVideo(A);
                }
            }
        });

    }

    public void playVideo(int A){

        videoView.stopPlayback();

        cacheManager.setFeed("video"+A);
        HttpProxyCacheServer proxy = cacheManager.getProxy();
        String proxyUrl = proxy.getProxyUrl(list.get(A));

        Uri uri = Uri.parse(proxyUrl);
        //设置视频路径
        videoView.setVideoURI(uri);

        //关联管理器
        videoView.setMediaController(controller);
        controller.setAnchorView(videoView);
        //开始播放视频
        videoView.start();
    }


    //拦截了返回键
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        return false;
    }
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".videoview.VideoPlayActivity">

    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/but_up"
        android:text="上一個"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


    <Button
        android:layout_below="@id/but_up"
        android:id="@+id/but"
        android:text="下一個"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

 

 类似资料: