Java通过流对MP4视频文件进行加密,H5 video播放流
加密目标文件
代码如下:
不建议进行二次加密,若二次加密必须要二次解密
- package com.xgt.util;
- import java.io.*;
- public class VideoEncodeUtil {
- public static void main(String[] args) throws Exception {
- encrypt("D:\\py交易\\11.mp4","fuckyourself");
- decrypt("D:\\py交易\\11.mp4","D:\\py交易\\22.mp4",4);
- System.out.println(readFileLastByte("D:\\py交易\\11.mp4",12));
- }
- /**
- * 文件file进行加密
- * @param fileUrl 文件路径
- * @param key 密码
- * @throws Exception
- */
- public static void encrypt(String fileUrl, String key) throws Exception {
- File file = new File(fileUrl);
- String path = file.getPath();
- if(!file.exists()){
- return;
- }
- int index = path.lastIndexOf("\\");
- String destFile = path.substring(0, index)+"\\"+"abc";
- File dest = new File(destFile);
- //获取待加密文件的输入流
- InputStream in = new FileInputStream(fileUrl);
- //创建中转文件输出流
- OutputStream out = new FileOutputStream(destFile);
- //待加密文件的流
- byte[] buffer = new byte[1024];
- int r;
- //加密之后的文件的流
- byte[] buffer2=new byte[1024];
- while (( r= in.read(buffer)) > 0) {
- for(int i=0;i<r;i++)
- {
- byte b=buffer[i];
- //buffer2[i]=b==255?0:++b;
- //每个字节加2加密
- b+=2;
- buffer2[i] = b;
- }
- out.write(buffer2, 0, r);
- out.flush();
- }
- in.close();
- out.close();
- file.delete();
- dest.renameTo(new File(fileUrl));
- appendMethodA(fileUrl, key);
- System.out.println("加密成功");
- }
- /**
- *
- * @param fileName
- * @param content 密钥
- */
- public static void appendMethodA(String fileName, String content) {
- try {
- // 打开一个随机访问文件流,按读写方式
- RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
- // 文件长度,字节数
- long fileLength = randomFile.length();
- //将写文件指针移到文件尾。
- randomFile.seek(fileLength);
- randomFile.writeBytes(content);
- randomFile.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 解密
- * @param fileUrl 源文件
- * @param tempUrl 临时文件
- * @param keyLength 密码长度
- * @return
- * @throws Exception
- */
- public static String decrypt(String fileUrl, String tempUrl, int keyLength) throws Exception{
- File file = new File(fileUrl);
- if (!file.exists()) {
- return null;
- }
- File dest = new File(tempUrl);
- if (!dest.getParentFile().exists()) {
- dest.getParentFile().mkdirs();
- }
- //获取待解密的文件输入流
- InputStream is = new FileInputStream(fileUrl);
- //创建目标文件输出流,用来生成解密后的文件
- OutputStream out = new FileOutputStream(tempUrl);
- byte[] buffer = new byte[1024];
- byte[] buffer2=new byte[1024];
- byte bMax=(byte)255;
- long size = file.length() - keyLength;
- int mod = (int) (size%1024);
- int div = (int) (size>>10);
- int count = mod==0?div:(div+1);
- int k = 1, r;
- while ((k <= count && ( r = is.read(buffer)) > 0)) {
- if(mod != 0 && k==count) {
- r = mod;
- }
- for(int i = 0;i < r;i++)
- {
- byte b=buffer[i];
- //buffer2[i]=b==0?bMax:--b;
- //每个字节减2解码
- b-=2;
- buffer2[i] = b;
- }
- out.write(buffer2, 0, r);
- k++;
- }
- out.close();
- is.close();
- return tempUrl;
- }
- /**
- * 判断文件是否加密
- * @param fileName
- * @return
- *
- * 加密成功返回key
- * 加密失败返回非key的字符串
- */
- public static String readFileLastByte(String fileName, int keyLength) {
- File file = new File(fileName);
- if(!file.exists())return "没有文件";
- StringBuffer str = new StringBuffer();
- try {
- // 打开一个随机访问文件流,按读写方式
- RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
- // 文件长度,字节数
- long fileLength = randomFile.length();
- //将写文件指针移到文件尾。
- for(int i = keyLength ; i>=1 ; i--){
- randomFile.seek(fileLength-i);
- str.append((char)randomFile.read());
- }
- randomFile.close();
- return str.toString();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "异常";
- }
- }
加密和解密接口
- /**
- * 加密视频
- * @param fileName
- */
- public void encryptVideo(String fileName){
- try {
- File file = new File(fileUrl);
- FileToolUtil.judeDirExists(file);
- /**
- * 加密不可进行多次
- * 判断是否有加密,加密过无需在加密
- */
- if(!VideoEncodeUtil.readFileLastByte(fileUrl+"\\"+fileName,key.length()).equals(key)) {
- VideoEncodeUtil.encrypt(fileUrl + "\\" + fileName, key);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 解密视频
- * @param fileName
- */
- public String decryptVideo(String fileName) throws Exception {
- File file = new File(SystemConstant.VIDEO_TEMP_PATH);
- FileToolUtil.judeDirExists(file);
- return VideoEncodeUtil.decrypt(SAFETY_EDU_LOCAL_PATH + fileName,
- SystemConstant.VIDEO_TEMP_PATH + fileName,
- SystemConstant.VIDEO_ENCRYPT_DECRYPT_KEY.length());
- }
播放加密视频方法(播放解密后的流):
- /**
- * 播放加密MP4
- * @param response
- * @throws IOException
- */
- @RequestMapping("/playMp4")
- @ResponseBody
- public void playMp4(HttpServletResponse response,String fileName) throws Exception {
- // TODO 测试联调结束后需删除
- fileName = "edu/video/6689AC1A506133C13FDA593135E2D923.mp4";
- String tempFilePath = SystemConstant.VIDEO_TEMP_PATH + fileName;
- try {
- tempFilePath = videoMaterialService.decryptVideo(fileName);
- // 解密过后的临时文件路径
- FileInputStream inputStream = new FileInputStream(tempFilePath);
- byte[] data = FileToolUtil.inputStreamToByte(inputStream);
- String diskfilename = "final.mp4";
- response.setContentType("video/mp4");
- response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\"" );
- System.out.println("data.length " + data.length);
- response.setContentLength(data.length);
- response.setHeader("Content-Range", "" + Integer.valueOf(data.length-1));
- response.setHeader("Accept-Ranges", "bytes");
- response.setHeader("Etag", "W/\"9767057-1323779115364\"");
- OutputStream os = response.getOutputStream();
- os.write(data);
- //先声明的流后关掉!
- os.flush();
- os.close();
- inputStream.close();
- }catch (Exception e){
- logger.error("....", e);
- }finally {
- VideoMaterialService.deleteVideoFile(tempFilePath);
- }
- }
前端代码展示
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title></title>
- </head>
- <body>
- <video src="http://127.0.0.1:8004/rest/video/playMp4?fileName=11.mp4" controls="controls">
- your browser does not support the video tag
- </video>
- </body>
- </html>
Java通过流对MP4视频文件进行加密,H5 video播放流的更多相关文章
- atitit.mp4 视频文件多媒体格式结构详解
atitit.mp4 视频文件多媒体格式结构详解 1. 一.基本概念1 2. MP4文件概述2 3. mp4是由一个个“box”组成的,2 4. 典型简化mp43 5. Fragments5 6. r ...
- H5网页播放器播不了服务器上的mp4视频文件
打开IIS,在功能视图里找到MIME类型菜单,打开该菜单后鼠标右键添加.mp4扩展名的MIME类型video/mp4 其他视频文件播放不了估计也得在IIS里添加对应的MIME类型(从服务器下载文件时也 ...
- android获取mp4视频文件总时长和视频宽高<转>
android使用 MediaMetadataRetriever 获取视频文件的 总时长 和视频的分辨率. 根据该方式获取视频信息可以看出不仅仅可以获取时长和分辨率,还能获取到其他的一些视频信息,不错 ...
- opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件
/** * @file main-opencv.cpp * @date July 2014 * @brief An exemplative main file for the use of ViBe ...
- JAVA通过URL链接获取视频文件信息(无需下载文件)
最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...
- Java字符流和字节流对文件操作
记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...
- java以流的形式输出文件
原文:http://blog.csdn.net/liutt55/article/details/78126614 public void downProcessFile(HttpServletRequ ...
- 是用VLC API将RTSP流convert为视频文件
一直在文档中找不到,接口设计的也不大好.不过终于在stackoverflow上找到解决方案了. 原来在LIbVLC库实例化的时候就需要传递相关的参数.我的代码大致是这样实现: const char * ...
- 关于m3u8格式的视频文件ts转mp4下载和key加密问题
一,利用网站浏览器F12键,利用谷歌浏览器插件找到视频的.m3u8文件,并打开. 二,打开m3u8文件后,里面有很多.ts的链接,和key的链接. 三,保存为html文件,下载ts文件,代码如下:可加 ...
随机推荐
- stderr和stdout(printf、fprintf、sprintf)(转)
本文转自:http://www.cnblogs.com/zhangyabin---acm/p/3203745.html 先区分一下:printf,sprintf,fprintf. 1,printf就是 ...
- Asp.Net Core下的两种路由配置方式
与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...
- sqlite初识
最近在部署PHP网站项目的时候,发现项目并没有使用传统的三大关系型数据库,而是采用了sqlite数据库,以前的时候,也见过sqlite,但是并没有深入了解其功能和用法,好奇心驱使,决定好好研究一下sq ...
- Origin如何使曲面变平滑?
在“绘图属性” - “绘图细节”窗口中选中 Layer1 下的曲面数据,“Colormap/Contours” 选项下有“Level”标签,选中并设置“Minor Levels”,将其数值调大即可.
- 一、SecureCRT 8.0 客户端连接服务器
1.通过远程连接服务器linux,连接的是ssh服务: 如图:ssh2协议是ssh的升级版. 连接模式: 2. Ctrl+d 快速退出==exit/quit/logout 3.SecureCRT 改变 ...
- [51nod] 1090 3个数和为0 暴力+二分
给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到 ...
- jqury表单验证
结合天天生鲜的用户注册页面,学习验证表单js register.js--表单验证源码 $(function(){ var error_name = false; var error_password ...
- P3267 [JLOI2016/SHOI2016]侦察守卫
$ \color{#0066ff}{ 题目描述 }$ 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的 ...
- Java函数的联级调用
String类的方法可以连续调用: String str="abc"; String result=str.trim().toUpperCase().concat("de ...
- Python3.0版本 从听说python可以做爬虫到自己第一成功做出爬虫的经历
前言 我自己是个python小白,工作也不是软件行业,但是日常没事时喜欢捣鼓一些小玩意,自身有点C语言基础. 听说python很火,可以做出爬虫去爬一些数据图片视频之类的东东,我的兴趣一下子就来了.然 ...