=======开头重要的绿色链接,不要后悔==========通过Ffmpeg实现MP4转码加密到M3u8本文不需要下载Ffmpeg到本地,只需要importmavendependenciesMaven依赖ws.schildjave-all-deps3.3.1ws.schildjave-core3.3.1ws。schildjave-nativebin-win643.3.12.编写FfmpegCMD类代码包com.gxw.util;importjava.io.IOException;导入java.io.InputStream;导入java.io.OutputStream;导入org.slf4j.Logger;导入org.slf4j.LoggerFactory;导入ws.schild.jave.process.ProcessKiller;importws.schild.jave.process.ProcessWrapper;importws.schild.jave.process.ffmpeg.DefaultFFMPEGLocator;/****@Description:(cmd方式调用ffmpeg)*@author:GuoXiangWen*@date:2022年04月16日上午08:08:08*@Copyright:*/publicclassFfmpegCmd{privatestaticfinalLoggerLOG=LoggerFactory.getLogger(ProcessWrapper.class);/**代表ffmpeg执行的进程。*/privateProcessffmpeg=null;/***一个进程杀手,使用关闭挂钩杀死ffmpeg进程,如果jvm执行*在正在进行的编码过程中关闭,则很有用。*/privateProcessKillerffmpegKiller=null;/**从ffmpeg进程标准输出通道读取的流。*/privateInputStreaminputStream=null;/**在ffmpeg进程标准输入通道中写入的流。*/privateOutputStreamoutputStream=null;/**从ffmpeg进程标准错误c读取的流通道。*/privateInputStreamerrorStream=null;/***使用先前给定的参数执行ffmpeg进程。**@paramdestroyOnRuntimeShutdown如果运行时VM关闭,则销毁进程*@paramopenIOStreams为输入/输出和错误输出打开IO流,当*destroyOnRuntimeShutdown也为false时应为false*@paramffmpegCmd窗口,例如(mp4转换为mov):*"-iC:\\Users\\hsj\\AppData\\Local\\Temp\\jave\\honer.mp4-c复制C:\\Users\\hsj\\AppData\\Local\\Temp\\jave\\honer_test.mov"*@throwsIOException如果进程调用失败。*/publicvoidexecute(booleandestroyOnRuntimeShutdown,booleanopenIOStreams,StringffmpegCmd)throwsIOException{DefaultFFMPEGLocatordefaultFFMPEGLocator=newDefaultFFMPEGLocator();StringBuffercmd=newStringBuffer(defaultFFMPEGLocator.getExecutablePath());//插入空格作为分隔符cmd.append("");cmd.append(ffmpegCmd);StringcmdStr=String.format("ffmpegCmdfinalis:%s",cmd.toString());System.out.println(cmdStr);日志信息(cmdStr);运行时runtime=Runtime.getRuntime();尝试{ffmpeg=runtime.exec(cmd.toString());如果(destroyOnRuntimeShutdown){ffmpegKiller=newProcessKiller(ffmpeg);runtime.addShutdownHook(ffmpegKiller);}if(openIOStreams){inputStream=ffmpeg.getInputStream();outputStream=ffmpeg.getOutputStream();errorStream=ffmpeg.getErrorStream();}}catch(Exceptione){e.printStackTrace();}}/***返回从ffmpeg进程标准输出通道读取的流。**@return从ffmpeg进程标准输出通道读取的流。*/公开cInputStreamgetInputStream(){返回输入流;}/***返回一个写入ffmpeg进程标准输入通道的流。**@return写入ffmpeg进程标准输入通道的流。*/publicOutputStreamgetOutputStream(){returnoutputStream;}/***返回从ffmpeg进程标准错误通道读取的流。**@return从ffmpeg进程标准错误通道读取的流。*/publicInputStreamgetErrorStream(){returnerrorStream;/**如果正在进行ffmpeg执行,它会杀死它。*/publicvoiddestroy(){if(inputStream!=null){try{inputStream.close();}catch(Throwablet){LOG.warn("关闭输入流时出错",t);}输入流=空;}if(outputStream!=null){试试{outputStream.close();}catch(Throwablet){LOG.warn("Errorclosingoutputstream",t);}outputStream=null;}if(errorStream!=null){try{errorStream.close();}catch(Throwablet){LOG.warn("Errorclosingerrorstream",t);}errorStream=null;}if(ffmpeg!=null){ffmpeg.destroy();ffmpeg=空;}if(ffmpegKiller!=null){运行时runtime=Runtime.getRuntime();runtime.removeShutdownHook(ffmpegKiller);ffmpegKiller=null;}}/***返回ffmpeg进程的退出代码如果进程还没有终止,它等待*进程终止**@return进程退出代码*/publicintgetProcessExitCode(){//确保它是终止尝试{ffmpeg.waitFor();}catch(InterruptedExceptionex){LOG.warn("在等待过程中中断,强制关闭?",ex);}返回ffmpeg.exitValue();}/**关闭**/publicvoidclose(){destroy();}}