HLS视频加密及本地播放

一、视频加密

将视频从MP4文件切片成多个ts文件,并使用AES-128对每一片视频进行加密,最后生成m3u8文件
视频加密参考:https://www.cnblogs.com/codeAB/p/9184266.html

1、生成公有key

openssl rand  16 > encrypt.key

2、生成私有key(16进制)

openssl rand -hex 16

3、按照下面格式新建一个encrypt.keyinfo的文件

Key URI  # enc.key的路径,使用http形式
Path to key file  # enc.key文件
Private key  #  上面生成的16进制的私有key

举个例子

http://192.168.1.111:8090/encrypt.key
/home/Admin/encrypt.key
8b4c39c498949536f8d2af1f6fec7d39

4、使用ffmpeg开始分片并加密

#           源视频文件 |单片时长(s) |             key信息文件           | 设置为点播,切片不会变   |                 分片名字          |  m3u8名字
ffmpeg -y -i test.mp4 -hls_time 4 -hls_key_info_file encrypt.keyinfo -hls_playlist_type vod -hls_segment_filename "test_%d.ts" index.m3u8

二、视频播放

对于Android手机是不能直接播放的,必须要搭建服务器,使用Ubuntu搭建服务器请参考网络直播/点播服务器搭建
这里主要讲解如何在Android手机上搭建m3u8视频服务器,NanoHTTPD可以轻松搭建WebServer。
本地播放参考https://gitee.com/2021/LPlayer

1、继承NanoHTTPD实现M3u8Server

public class M3u8Server extends NanoHTTPD {
    private static String TAG = "M3U8Server";
    private static NanoHTTPD server;
    public static final int PORT = 8999;

    /**
     * 启动服务
     */
    public static void execute() {
        if (server != null) return;
        try {
            server = M3u8Server.class.newInstance();
            server.start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
        } catch (IOException e) {
            Log.e(TAG, "Start m3u8 server fail:", e);
            System.exit(-1);
        } catch (Exception e) {
            Log.e(TAG, "Start m3u8 server fail:", e);
            System.exit(-1);
        }

        try {
            System.in.read();
        } catch (Throwable ignored) {
        }
    }

    /**
     * 关闭服务
     */
    public static void finish() {
        if (server != null) {
            server.stop();
            server = null;
        }
    }

    public M3u8Server() {
        super(PORT);
    }

    @Override
    public Response serve(IHTTPSession session) {
        String url = String.valueOf(session.getUri());
        Log.d(TAG, "Request URL:" + url);
        File file = new File(url);

        if (file.exists()) {
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/html", "Not found:" + url);
            }
            long length = file.length();
            // ts文件
            String mimeType = "video/mpeg";
            if (url.contains(".m3u8")) {
                // m3u8文件
                mimeType = "video/x-mpegURL";
            }
            return newChunkedResponse(Response.Status.OK, mimeType, fis);
        } else {
            return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/html", "Not found:" + url);
        }
    }
}

2、使用

开启服务

M3u8Server.execute();

关闭服务

M3u8Server.finish();

服务器请求链接说明

//                                      端口 |    m3u8文件路径
String.format("http://127.0.0.1:%d/%s", 8999, "/storage/emulated/0/Movies/crypt/index.m3u8")

最后提供一个单java文件的NanoHTTPD,简单,高效,赞一个




posted on   &大飞  阅读(2793)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示