========开头重要的绿色链接,不要后悔,和下面的一起联想=========JAVA本地不需要下载ffmpeg,实现FfmpegCMD本文不需要在本地下载Ffmpeg,导入maven依赖即可1.添加maven依赖<依赖项>ws.schildjave-all-deps3.3.1ws.schildjave-core<版本>3.3.1ws.schildjave-nativebin-win643.3.12、编写代码包com.gxw.util;importcom.alibaba.fastjson.JSON;importws.schild.jave.MultimediaObject;importws.schild.jave。info.MultimediaInfo;importjava.io.*;导入java.math.BigDecimal;导入java.math.RoundingMode;导入java.nio.channels.FileChannel;导入java.util.HashMap;导入java.util.Map;导入java.util.concurrent.CompletableFuture;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;/***@Description:(MP4转码HLSm3u8AES128加密)*@author:GuoXiangWen*@date:2022年4月16日上午08:08:08*/publicclassEncodeVideoUtils{privatestaticStringPREIX="gxwAwdlpgyn";//加密后的文件路径,如:enc.key、enc.keyinfo、m3u8文件、ts文件等privatestaticStringENC_DIRECTORY="D:/test-ffmpeg/"+PREIX;//加密密钥地址privatestaticStringENC_KEY_FILE_PATH=null;//enc.keyinfo地址privatestaticStringENC_KEY_INFO_FILE_PATH=null;//秘钥http地址privatestaticStringENC_HTTP_PATH="http://127.0.0.1:8848/Student";//执行成功0,失败1privatestaticintCODE_SUCCESS=0;私有静态int代码失败=1;//$encInfoPath,$encPath为需要替换的ENC_DIRECTORY文件路径privatestaticStringcmd_enc="-y-i{videoPath}-hls_time12-hls_key_info_file$encInfoPath-hls_playlist_typevod-hls_segment_filename$encPath\\{tsName}_%3d.ts$encPath\\{saveM3u8Name}";publicstaticvoidmain(String[]args){//视频路径StringvideoPath="D:/test-ffmpeg/test.mp4";系统输出。println(JSON.toJSONString(encodeVideo(videoPath,"test","1")));}/***Step1:创建enc.keyinfo文件**Step2:HLSm3u8AES128加密*@paramvideoPathvideoPath*@paramvideoType视频类型,*@paramindex视频字幕,自增*@返回*/publicsynchronizedstaticMapencodeVideo(StringvideoPath,StringvideoType,Stringindex){StringvideoTypeBP=videoType;字符串mp4Name=videoPath.substring(videoPath.lastIndexOf('/')+1,videoPath.lastIndexOf(".mp4"));字符串saveM3u8Name=PREIX+RandomUtils.generateRandomString(32);//设置tsNamecmd_enc=cmd_enc.replace("{tsName}",saveM3u8Name);//设置视频地址cmd_enc=cmd_enc.replace("{videoPath}",videoPath);//设置视频保存名地址cmd_enc=cmd_enc.replace("{saveM3u8Name}",saveM3u8Name+".m3u8");if(videoType.equals("")||videoType==null){videoType="";}else{videoType="/"+Md5Utils.md5Password(videoType,8);}ENC_DIRECTORY=ENC_DIRECTORY+videoType+"/"+index;ENC_KEY_FILE_PATH=ENC_DIRECTORY+"/"+saveM3u8Name+".key";ENC_KEY_INFO_FILE_PATH=ENC_DIRECTORY+"/"+saveM3u8Name+".keyinfo";ENC_HTTP_PATH=ENC_HTTP_PATH+"/"+PREIX+videoType+"/"+index+"/"+saveM3u8N名称+".key";//首先创建两个活动线程的线程池ExecutorServiceexecutor=Executors.newFixedThreadPool(10);//异步执行//第一步:创建enc.keyinfo文件等CompletableFuturecompletableFutureTask=CompletableFuture.supplyAsync(()->{//保存加密视频目录encFileencFilePathDir=newFile(ENC_DIRECTORY);if(!encFilePathDir.exists()){//判断目录是否存在encFilePathDir.mkdirs();}//写入文件内容enc.keyBufferedWriterbwkey=null;//写入文件内容enc.keyinfoBufferedWriterbwkeyInfo=null;try{//FileFilefileKey=newFile(ENC_KEY_FILE_PATH);FilefileKeyInfo=newFile(ENC_KEY_INFO_FILE_PATH);//初始化存在deleteif(fileKey.exists()){fileKey.delete();}if(fileKeyInfo.exists()){fileKeyInfo.delete();}bwkey=newBufferedWriter(newFileWriter(fileKey));bwkeyInfo=newBufferedWriter(newFileWriter(fileKeyInfo));//writekey--自定义AES128加密密钥bwkey.write("********替换为自己的加密密钥*******");//writekeyInfo//keyURL地址,可以对URL进行鉴权bwkeyInfo.write(ENC_HTTP_PATH);bwkeyInfo.newLine();//完整路径,绝对路径bwkeyInfo.write(ENC_KEY_FILE_PATH);bwkey.flush();bwkeyInfo.flush();}catch(IOExceptione){e.printStackTrace();//恢复默认ENC_KEY_INFO_FILE_PATH=null;}finally{try{//一定要关闭文件bwkey.close();bwkeyInfo.close();}catch(IOExceptione){e.printStackTrace();}}返回ENC_KEY_INFO_文件路径;},executor).exceptionally(e->{System.out.println(e);return"false";});//异步执行//第二步:HLSm3u8AES128加密CompletableFuturecompletableFutureTaskHls=completableFutureTask.thenApplyAsync((StringencKeyInfoFilePath)->{if(encKeyInfoFilePath==null||encKeyInfoFilePath.length()==0){returnCODE_FAIL;}整数codeTmp=cmdExecut(cmd_enc.replace("$encInfoInfoPath",FilePathKey)replace("$encPath",ENC_DIRECTORY));if(CODE_SUCCESS!=codeTmp){returnCODE_FAIL;}System.out.println("Type:"+videoTypeBP+"Video:"+mp4Name+"加密,成功!");returncodeTmp;},executor).exceptionally(e->{System.out.println(e);returnnull;});//获取执行结果//code=0表示正常try{System.out.println(String.format("获取最终执行结果:%s",completableFutureTaskHls.get()==CODE_SUCCESS?"Success!":"Failure!"));}catch(InterruptedExceptione){Thread.currentThread().interrupt();e.printStackTrace();}catch(ExecutionExceptione){e.printStackTrace();}//返回结果MapresultMap=newHashMap<>();//视频名称resultMap.put("videoName",mp4Name);//视频大小resultMap.put("videoSize",getVideoSize(newFile(videoPath)));//视频时长resultMap.put("videoTime",getVideoTime(videoPath));//保存m3u8加密地址resultMap.put("saveM3u8Path",ENC_DIRECTORY+"/"+saveM3u8Name+".m3u8");返回结果图;}/****@Description:(执行ffmpeg自定义命令)*@param:@paramcmdStr*@param:@return*@return:Integer*@throws*/publicstaticIntegercmdExecut(StringcmdStr){//code=0表示普通Integercode=null;FfmpegCmdffmpegCmd=newFfmpegCmd();/***错误流*/InputStreamerrorStream=null;尝试{ffmpegCmd.execute(false,true,cmdStr);errorStream=ffmpegCmd.getErrorStream();//打印进程intlen=0;while((len=errorStream.read())!=-1){System.out.print((char)len);}//code=0表示正常代码=ffmpegCmd.getProcessExitCode();}catch(IOExceptione){e.printStackTrace();}finally{//关闭资源ffmpegCmd.close();}//返回返回码;}/***获取视频时长**@paramFileUrl*@return*/publicstaticStringgetVideoTime(StringFileUrl){Filesource=newFile(FileUrl);字符串长度="";尝试{MultimediaObject实例=newMultimediaObject(source);MultimediaInforesult=instance.getInfo();longls=result.getDuration()/1000;整数小时=(int)(ls/0);整数分=(int)(ls%3600)/60;整数秒=(int)(ls-小时*3600-分钟*60);字符串hr=hour.toString();字符串mi=minute.toString();字符串se=second.toString();如果(hr.length()<2){hr="0"+hr;}if(mi.length()<2){mi="0"+mi;}if(se.length()<2){se="0"+se;}length=hr+":"+mi+":"+se;}catch(Exceptione){e.printStackTrace();}返回长度;}/***获取视频大小**@paramsource*@return*/publicstaticStringgetVideoSize(Filesource){FileChannelfc=null;字符串大小="";尝试{FileInputStreamfis=newFileInputStream(source);fc=fis.getChannel();BigDecimalfileSize=newBigDecimal(fc.size());大小=文件大小.divide(newBigDecimal(1024*1024),2,RoundingMode.HALF_UP)+"MB";}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}finally{if(null!=fc){try{fc.close();}catch(IOExceptione){e.printStackTrace();}}}返回大小;}}3.运行测试,得到如下结果,表示成功: