IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java实现视频加密及播放 -> 正文阅读

[Java知识库]Java实现视频加密及播放

技术栈

名称服务名称、版本及作用
后端语言Java
播放方式web前端
代理服务器nginx 1.9.7
视频切分工具ffmpeg 5.0
视频播放工具video.js

概述

实现视频加密的大概思路说一下,先通过ffmpeg将mp4格式的视频文件转成h264格式的ts文件,转完后的视频文件主要文件形式为两种,一种为.m3u8的文件,这个文件也可以说是摘要文件,主要记录了当前视频所有的片段文件以及如果使用了加密文件那么加密文件的路径地址,另一种文件为.ts文件,这种类型文件为数据文件,即视频文件。转换的方式实际就是一条ffmpeg开头的指令,ffmpeg的功能是在太强了除此之外还可以做你能想到的跟视频相关的操作(另外多说一句,如果想做直播推流的可以在整合一个rtmp服务,网上资料很多)。如果视频需要加密,切分的时候需要携带你生成的enc.key参数,这样的话你的ts文件就是加密的文件,如果你不带加密enc.key文件那么你的.ts文件是可以在各种播放器中直接播放的。生成好之后我们将m3u8、ts、enc.key文件上传到nginx的html路径下(如果不想key文件与ts文件相同路径,可以编写接口传输另外修改m3u8文件中的uri参数改成能够只能访问到key的get接口地址即可)。然后通过前端的videojs视频播放插件,就可以实现视频的加密播放,默认的加密算法为AES-128,话不多说直接开始



实现MP4视频文件加密切分

下面介绍的是在本地完成m3u8视频加密,如果想通过代码实现可以参考lz这篇文章,里面包含ffmpeg的核心视频切分代码,不过不包含生成加密视频文件:Java实现上传的视频转m3u8上传到OSS后播放

视频切分成m3u8文件
参考链接:使用ffmpeg视频切片并加密

  • 生成加密用的 key,需要安装openssl服务
    windows安装openssl
    centos7安装openssl:sudo yum install pcre-devel openssl openssl-devel -y
  • 生成一个enc.key文件,license与windows指令相同,生成的路径需要在nginx的html目录下,lz是在html的enc目录下
openssl rand  16 > enc.key

在这里插入图片描述
生成加密串,记下来

openssl rand -hex 16

在这里插入图片描述

新建一个文件 enc.keyinfo 内容格式如下:

Key URI  # enc.key的路径,使用http形式

Path to key file  # enc.key文件

IV  #  上面生成的iv

例如lz的:

在这里插入图片描述

视频切分,传一个test.mp4到enc.key路径下,通过黑窗口执行下面的指令

ffmpeg -y  -i test.mp4 -hls_time 12  -hls_key_info_file enc.keyinfo  -hls_playlist_type vod  -hls_segment_filename "file%d.ts"  playlist.m3u8
ffmpeg -y \

-i test.mp4 \

-hls_time 12 \       # 将test.mp4分割成每个小段多少秒

-hls_key_info_file enc.keyinfo \

-hls_playlist_type vod \   # vod 是点播,表示PlayList不会变
-hls_segment_filename "file%d.ts" \  #  每个小段的文件名

playlist.m3u8   #  生成的m3u8文件

切分完成如图:
在这里插入图片描述
在这里插入图片描述
尝试使用播放器播放ts文件,加密后的ts文件是无法播放的
在这里插入图片描述


配置nginx

nginx服务器默认无法播放m3u8格式的文件需要添加配置,修改nginx的nginx.conf文件,新增如下配置,配置完后需要重启nginx服务

location /video {
	 types{
		 application/vnd.apple.mpegurl m3u8;
		 video/mp2t ts;
		 }
     	alias /usr/local/nginx/html/m3u8;
     	add_header Cache-Control no-cache;
	add_header Access-Control-Allow-Origin *;
	}

截图如下

在这里插入图片描述
注意:lz配置方法需要将所有m3u8文件放在nginx的m3u8目录下,并且访问的时候路径是/video(避免路径上出现敏感字符)

使用xftp传到m3u8的test路径下
在这里插入图片描述


web前端使用videojs查看

  • 创建m3u8.html文件,需要注意的是需要下载video-js.css、video.js、videojs-contrib-hls.js在m3u8的同级目录下
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>videojs-contrib-hls embed</title>
  
  <!--

  Uses the latest versions of video.js and videojs-contrib-hls.

  To use specific versions, please change the URLs to the form:

  <link href="https://unpkg.com/video.js@5.16.0/dist/video-js.css" rel="stylesheet">
  <script src="https://unpkg.com/video.js@5.16.0/dist/video.js"></script>
  <script src="https://unpkg.com/videojs-contrib-hls@4.1.1/dist/videojs-contrib-hls.js"></script>

  -->

  <link href="./video-js.css" rel="stylesheet">
  
  
</head>
<body>
  <h1>Video.js Example Embed</h1>

  <video id="my_video_1" class="video-js vjs-default-skin" controls preload="auto" width="640" height="268" 
  data-setup='{}'>
    <source src="http://124.71.187.225/video/encry/a65105d4ae064e829d7e1fea98b3f9e1.player.m3u8" type="application/x-mpegURL">
  </video>
  
  
  <script src="./video.js"></script>
  <script src="./videojs-contrib-hls.js"></script>

  
</body>
</html>
  • 层级关系如下
    在这里插入图片描述
  • 修改source标签中的地址为加密后的文件地址

在这里插入图片描述

  • 修改m3u8文件的URI地址为enc.key
    修改前
    在这里插入图片描述
    修改后
    在这里插入图片描述
    打开m3u8.html文件访问视频,并且F12打开调试窗口,可以看到视频播放的过程中伴随着enc.key文件的下载,后期enc.key文件可以通过接口传输并且增加expir参数,感兴趣的可以关注一下,后期会出
    在这里插入图片描述

资源整理花费了大量时间,对大家有帮助的话希望点个赞支持一下,感谢。
余生还长,切勿惆怅

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:14:58  更:2022-03-08 22:17:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:35:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码