加密目标文件

代码如下:

不建议进行二次加密,若二次加密必须要二次解密

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播放流的更多相关文章

  1. atitit.mp4 视频文件多媒体格式结构详解

    atitit.mp4 视频文件多媒体格式结构详解 1. 一.基本概念1 2. MP4文件概述2 3. mp4是由一个个“box”组成的,2 4. 典型简化mp43 5. Fragments5 6. r ...

  2. H5网页播放器播不了服务器上的mp4视频文件

    打开IIS,在功能视图里找到MIME类型菜单,打开该菜单后鼠标右键添加.mp4扩展名的MIME类型video/mp4 其他视频文件播放不了估计也得在IIS里添加对应的MIME类型(从服务器下载文件时也 ...

  3. android获取mp4视频文件总时长和视频宽高<转>

    android使用 MediaMetadataRetriever 获取视频文件的 总时长 和视频的分辨率. 根据该方式获取视频信息可以看出不仅仅可以获取时长和分辨率,还能获取到其他的一些视频信息,不错 ...

  4. opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件

    /** * @file main-opencv.cpp * @date July 2014 * @brief An exemplative main file for the use of ViBe ...

  5. JAVA通过URL链接获取视频文件信息(无需下载文件)

    最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...

  6. Java字符流和字节流对文件操作

    记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writ ...

  7. java以流的形式输出文件

    原文:http://blog.csdn.net/liutt55/article/details/78126614 public void downProcessFile(HttpServletRequ ...

  8. 是用VLC API将RTSP流convert为视频文件

    一直在文档中找不到,接口设计的也不大好.不过终于在stackoverflow上找到解决方案了. 原来在LIbVLC库实例化的时候就需要传递相关的参数.我的代码大致是这样实现: const char * ...

  9. 关于m3u8格式的视频文件ts转mp4下载和key加密问题

    一,利用网站浏览器F12键,利用谷歌浏览器插件找到视频的.m3u8文件,并打开. 二,打开m3u8文件后,里面有很多.ts的链接,和key的链接. 三,保存为html文件,下载ts文件,代码如下:可加 ...

随机推荐

  1. SOLR企业搜索平台 二 (分词安装)

    标签:linux lucene 分词 solr 全文检索 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://3961409.blog ...

  2. C++三种野指针及应对/内存泄露

    C++三种野指针及应对/内存泄露    野指针,也就是指向不可用内存区域的指针.如果对野指针进行操作,将会使程序发生不可预知的错误,甚至可能直接引起崩溃.         野指针不是NULL指针,是指 ...

  3. Apache启动报错Address already in use: make_sock: could not bind to...

    Apache启动时报错:(98)Address already in use: make_sock: could not bind to... # /etc/init.d/httpd start St ...

  4. 《Beginning Java 7》 - 7 - abstract class 抽象类 和 interface 接口

    1. 抽象类: 为什么用抽象类: 一些 generic 的类本身并没有现实意义,所以不需要被实例化.比如动物,自然界没有动物这个物种,但却有无数的继承自动物的物种,那么动物本身可以是一个抽象类. 抽象 ...

  5. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  6. 2个list取差集

    list操作 element in a list but not in other list,元素在一个list,不在另一个list 在数据量大的时候使用numpy的setdiff1d方法的性能非常好 ...

  7. “全栈2019”Java第五十一章:继承与final关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. 2019中山大学程序设计竞赛(重现赛) Clumsy Keke

    Problem Description Keke is currently studying engineering drawing courses, and the teacher has taug ...

  9. MySQL大数据高并发处理之-查询的优化

    http://www.php1.cn/Content/MySQL_DaShuJuGaoBingFaChuLiZhi_-_ChaXunDeYouHua.html

  10. 【转】C++ 类访问控制public/private/protected探讨

    示例1:---------------------------------------- class C{ int c1; int c2;public: void set(C* s, int i, i ...