加密目标文件

代码如下:

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

  1. package com.xgt.util;
  2. import java.io.*;
  3. public class VideoEncodeUtil {
  4.  
  5. public static void main(String[] args) throws Exception {
  6. encrypt("D:\\py交易\\11.mp4","fuckyourself");
  7. decrypt("D:\\py交易\\11.mp4","D:\\py交易\\22.mp4",4);
  8. System.out.println(readFileLastByte("D:\\py交易\\11.mp4",12));
  9. }
  10. /**
  11. * 文件file进行加密
  12. * @param fileUrl 文件路径
  13. * @param key 密码
  14. * @throws Exception
  15. */
  16. public static void encrypt(String fileUrl, String key) throws Exception {
  17. File file = new File(fileUrl);
  18. String path = file.getPath();
  19. if(!file.exists()){
  20. return;
  21. }
  22. int index = path.lastIndexOf("\\");
  23. String destFile = path.substring(0, index)+"\\"+"abc";
  24. File dest = new File(destFile);
  25. //获取待加密文件的输入流
  26. InputStream in = new FileInputStream(fileUrl);
  27. //创建中转文件输出流
  28. OutputStream out = new FileOutputStream(destFile);
  29. //待加密文件的流
  30. byte[] buffer = new byte[1024];
  31. int r;
  32. //加密之后的文件的流
  33. byte[] buffer2=new byte[1024];
  34. while (( r= in.read(buffer)) > 0) {
  35. for(int i=0;i<r;i++)
  36. {
  37. byte b=buffer[i];
  38. //buffer2[i]=b==255?0:++b;
  39. //每个字节加2加密
  40. b+=2;
  41. buffer2[i] = b;
  42.  
  43. }
  44. out.write(buffer2, 0, r);
  45. out.flush();
  46. }
  47. in.close();
  48. out.close();
  49. file.delete();
  50. dest.renameTo(new File(fileUrl));
  51. appendMethodA(fileUrl, key);
  52. System.out.println("加密成功");
  53. }
  54. /**
  55. *
  56. * @param fileName
  57. * @param content 密钥
  58. */
  59. public static void appendMethodA(String fileName, String content) {
  60. try {
  61. // 打开一个随机访问文件流,按读写方式
  62. RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
  63. // 文件长度,字节数
  64. long fileLength = randomFile.length();
  65. //将写文件指针移到文件尾。
  66. randomFile.seek(fileLength);
  67. randomFile.writeBytes(content);
  68. randomFile.close();
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. }
  72. }
  73. /**
  74. * 解密
  75. * @param fileUrl 源文件
  76. * @param tempUrl 临时文件
  77. * @param keyLength 密码长度
  78. * @return
  79. * @throws Exception
  80. */
  81. public static String decrypt(String fileUrl, String tempUrl, int keyLength) throws Exception{
  82. File file = new File(fileUrl);
  83. if (!file.exists()) {
  84. return null;
  85. }
  86. File dest = new File(tempUrl);
  87. if (!dest.getParentFile().exists()) {
  88. dest.getParentFile().mkdirs();
  89. }
  90. //获取待解密的文件输入流
  91. InputStream is = new FileInputStream(fileUrl);
  92. //创建目标文件输出流,用来生成解密后的文件
  93. OutputStream out = new FileOutputStream(tempUrl);
  94. byte[] buffer = new byte[1024];
  95. byte[] buffer2=new byte[1024];
  96. byte bMax=(byte)255;
  97. long size = file.length() - keyLength;
  98. int mod = (int) (size%1024);
  99. int div = (int) (size>>10);
  100. int count = mod==0?div:(div+1);
  101. int k = 1, r;
  102. while ((k <= count && ( r = is.read(buffer)) > 0)) {
  103. if(mod != 0 && k==count) {
  104. r = mod;
  105. }
  106. for(int i = 0;i < r;i++)
  107. {
  108. byte b=buffer[i];
  109. //buffer2[i]=b==0?bMax:--b;
  110. //每个字节减2解码
  111. b-=2;
  112. buffer2[i] = b;
  113.  
  114. }
  115. out.write(buffer2, 0, r);
  116. k++;
  117. }
  118. out.close();
  119. is.close();
  120. return tempUrl;
  121. }
  122. /**
  123. * 判断文件是否加密
  124. * @param fileName
  125. * @return
  126. *
  127. * 加密成功返回key
  128. * 加密失败返回非key的字符串
  129. */
  130. public static String readFileLastByte(String fileName, int keyLength) {
  131. File file = new File(fileName);
  132. if(!file.exists())return "没有文件";
  133. StringBuffer str = new StringBuffer();
  134. try {
  135. // 打开一个随机访问文件流,按读写方式
  136. RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
  137. // 文件长度,字节数
  138. long fileLength = randomFile.length();
  139. //将写文件指针移到文件尾。
  140. for(int i = keyLength ; i>=1 ; i--){
  141. randomFile.seek(fileLength-i);
  142. str.append((char)randomFile.read());
  143. }
  144. randomFile.close();
  145. return str.toString();
  146. } catch (IOException e) {
  147. e.printStackTrace();
  148. }
  149. return "异常";
  150. }
  151. }

加密和解密接口

  1. /**
  2. * 加密视频
  3. * @param fileName
  4. */
  5. public void encryptVideo(String fileName){
  6. try {
  7. File file = new File(fileUrl);
  8. FileToolUtil.judeDirExists(file);
  9. /**
  10. * 加密不可进行多次
  11. * 判断是否有加密,加密过无需在加密
  12. */
  13. if(!VideoEncodeUtil.readFileLastByte(fileUrl+"\\"+fileName,key.length()).equals(key)) {
  14. VideoEncodeUtil.encrypt(fileUrl + "\\" + fileName, key);
  15. }
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }
  20.  
  21. /**
  22. * 解密视频
  23. * @param fileName
  24. */
  25. public String decryptVideo(String fileName) throws Exception {
  26.  
  27. File file = new File(SystemConstant.VIDEO_TEMP_PATH);
  28. FileToolUtil.judeDirExists(file);
  29. return VideoEncodeUtil.decrypt(SAFETY_EDU_LOCAL_PATH + fileName,
  30. SystemConstant.VIDEO_TEMP_PATH + fileName,
  31. SystemConstant.VIDEO_ENCRYPT_DECRYPT_KEY.length());
  32. }

播放加密视频方法(播放解密后的流):

  1. /**
  2. * 播放加密MP4
  3. * @param response
  4. * @throws IOException
  5. */
  6. @RequestMapping("/playMp4")
  7. @ResponseBody
  8. public void playMp4(HttpServletResponse response,String fileName) throws Exception {
  9.  
  10. // TODO 测试联调结束后需删除
  11. fileName = "edu/video/6689AC1A506133C13FDA593135E2D923.mp4";
  12. String tempFilePath = SystemConstant.VIDEO_TEMP_PATH + fileName;
  13. try {
  14.  
  15. tempFilePath = videoMaterialService.decryptVideo(fileName);
  16. // 解密过后的临时文件路径
  17.  
  18. FileInputStream inputStream = new FileInputStream(tempFilePath);
  19. byte[] data = FileToolUtil.inputStreamToByte(inputStream);
  20. String diskfilename = "final.mp4";
  21. response.setContentType("video/mp4");
  22. response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\"" );
  23. System.out.println("data.length " + data.length);
  24. response.setContentLength(data.length);
  25. response.setHeader("Content-Range", "" + Integer.valueOf(data.length-1));
  26. response.setHeader("Accept-Ranges", "bytes");
  27. response.setHeader("Etag", "W/\"9767057-1323779115364\"");
  28. OutputStream os = response.getOutputStream();
  29.  
  30. os.write(data);
  31. //先声明的流后关掉!
  32. os.flush();
  33. os.close();
  34. inputStream.close();
  35.  
  36. }catch (Exception e){
  37. logger.error("....", e);
  38. }finally {
  39. VideoMaterialService.deleteVideoFile(tempFilePath);
  40. }
  41.  
  42. }

前端代码展示

  1. <!DOCTYPE html>
  2. <html>
  3.  
  4. <head>
  5. <meta charset="UTF-8">
  6. <title></title>
  7.  
  8. </head>
  9.  
  10. <body>
  11.  
  12. <video src="http://127.0.0.1:8004/rest/video/playMp4?fileName=11.mp4" controls="controls">
  13. your browser does not support the video tag
  14. </video>
  15.  
  16. </body>
  17.  
  18. </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. stderr和stdout(printf、fprintf、sprintf)(转)

    本文转自:http://www.cnblogs.com/zhangyabin---acm/p/3203745.html 先区分一下:printf,sprintf,fprintf. 1,printf就是 ...

  2. Asp.Net Core下的两种路由配置方式

    与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...

  3. sqlite初识

    最近在部署PHP网站项目的时候,发现项目并没有使用传统的三大关系型数据库,而是采用了sqlite数据库,以前的时候,也见过sqlite,但是并没有深入了解其功能和用法,好奇心驱使,决定好好研究一下sq ...

  4. Origin如何使曲面变平滑?

    在“绘图属性” - “绘图细节”窗口中选中 Layer1 下的曲面数据,“Colormap/Contours” 选项下有“Level”标签,选中并设置“Minor Levels”,将其数值调大即可.

  5. 一、SecureCRT 8.0 客户端连接服务器

    1.通过远程连接服务器linux,连接的是ssh服务: 如图:ssh2协议是ssh的升级版. 连接模式: 2. Ctrl+d 快速退出==exit/quit/logout 3.SecureCRT 改变 ...

  6. [51nod] 1090 3个数和为0 暴力+二分

    给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到 ...

  7. jqury表单验证

    结合天天生鲜的用户注册页面,学习验证表单js register.js--表单验证源码 $(function(){ var error_name = false; var error_password ...

  8. P3267 [JLOI2016/SHOI2016]侦察守卫

    $ \color{#0066ff}{ 题目描述 }$ 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的 ...

  9. Java函数的联级调用

    String类的方法可以连续调用: String str="abc"; String result=str.trim().toUpperCase().concat("de ...

  10. Python3.0版本 从听说python可以做爬虫到自己第一成功做出爬虫的经历

    前言 我自己是个python小白,工作也不是软件行业,但是日常没事时喜欢捣鼓一些小玩意,自身有点C语言基础. 听说python很火,可以做出爬虫去爬一些数据图片视频之类的东东,我的兴趣一下子就来了.然 ...