=======结尾重要绿色链接,不看悔恨==========
通过Ffmpeg实现MP4转码加密为M3u8
本文无需本地下载Ffmpeg,只需引入maven依赖即可
1、引入maven依赖
<!--m3u8视频转码须要FFmpeg依赖--> <dependency> <groupId>ws.schild</groupId> <artifactId>jave-all-deps</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>ws.schild</groupId> <artifactId>jave-core</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>ws.schild</groupId> <artifactId>jave-nativebin-win64</artifactId> <version>3.3.1</version> </dependency>
2、编写FfmpegCMD类代码
package com.gxw.util;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import ws.schild.jave.process.ProcessKiller;import ws.schild.jave.process.ProcessWrapper;import ws.schild.jave.process.ffmpeg.DefaultFFMPEGLocator;/** * * @Description:(cmd形式调用ffmpeg) * @author: GuoXiangWen * @date: 2022年04月16日 上午08:08:08 * @Copyright: */public class FfmpegCmd { private static final Logger LOG = LoggerFactory.getLogger(ProcessWrapper.class); /** The process representing the ffmpeg execution. */ private Process ffmpeg = null; /** * A process killer to kill the ffmpeg process with a shutdown hook, useful if the jvm execution * is shutted down during an ongoing encoding process. */ private ProcessKiller ffmpegKiller = null; /** A stream reading from the ffmpeg process standard output channel. */ private InputStream inputStream = null; /** A stream writing in the ffmpeg process standard input channel. */ private OutputStream outputStream = null; /** A stream reading from the ffmpeg process standard error channel. */ private InputStream errorStream = null; /** * Executes the ffmpeg process with the previous given arguments. * * @param destroyOnRuntimeShutdown destroy process if the runtime VM is shutdown * @param openIOStreams Open IO streams for input/output and errorout, should be false when * destroyOnRuntimeShutdown is false too * @param ffmpegCmd windows such as (mp4 transform to mov): * " -i C:\\Users\\hsj\\AppData\\Local\\Temp\\jave\\honer.mp4 -c copy C:\\Users\\hsj\\AppData\\Local\\Temp\\jave\\honer_test.mov " * @throws IOException If the process call fails. */ public void execute(boolean destroyOnRuntimeShutdown, boolean openIOStreams, String ffmpegCmd) throws IOException { DefaultFFMPEGLocator defaultFFMPEGLocator = new DefaultFFMPEGLocator(); StringBuffer cmd = new StringBuffer(defaultFFMPEGLocator.getExecutablePath()); //insert blank for delimiter cmd.append(" "); cmd.append(ffmpegCmd); String cmdStr = String.format("ffmpegCmd final is :%s", cmd.toString()); System.out.println(cmdStr); LOG.info(cmdStr); Runtime runtime = Runtime.getRuntime(); try { ffmpeg = runtime.exec(cmd.toString()); if (destroyOnRuntimeShutdown) { ffmpegKiller = new ProcessKiller(ffmpeg); runtime.addShutdownHook(ffmpegKiller); } if (openIOStreams) { inputStream = ffmpeg.getInputStream(); outputStream = ffmpeg.getOutputStream(); errorStream = ffmpeg.getErrorStream(); } } catch (Exception e) { e.printStackTrace(); } } /** * Returns a stream reading from the ffmpeg process standard output channel. * * @return A stream reading from the ffmpeg process standard output channel. */ public InputStream getInputStream() { return inputStream; } /** * Returns a stream writing in the ffmpeg process standard input channel. * * @return A stream writing in the ffmpeg process standard input channel. */ public OutputStream getOutputStream() { return outputStream; } /** * Returns a stream reading from the ffmpeg process standard error channel. * * @return A stream reading from the ffmpeg process standard error channel. */ public InputStream getErrorStream() { return errorStream; } /** If there's a ffmpeg execution in progress, it kills it. */ public void destroy() { if (inputStream != null) { try { inputStream.close(); } catch (Throwable t) { LOG.warn("Error closing input stream", t); } inputStream = null; } if (outputStream != null) { try { outputStream.close(); } catch (Throwable t) { LOG.warn("Error closing output stream", t); } outputStream = null; } if (errorStream != null) { try { errorStream.close(); } catch (Throwable t) { LOG.warn("Error closing error stream", t); } errorStream = null; } if (ffmpeg != null) { ffmpeg.destroy(); ffmpeg = null; } if (ffmpegKiller != null) { Runtime runtime = Runtime.getRuntime(); runtime.removeShutdownHook(ffmpegKiller); ffmpegKiller = null; } } /** * Return the exit code of the ffmpeg process If the process is not yet terminated, it waits for * the termination of the process * * @return process exit code */ public int getProcessExitCode() { // Make sure it's terminated try { ffmpeg.waitFor(); } catch (InterruptedException ex) { LOG.warn("Interrupted during waiting on process, forced shutdown?", ex); } return ffmpeg.exitValue(); } /**close**/ public void close() { destroy(); }}