ffmpeg系列
Java使用FFmpeg(自定义cmd)
Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长
Java使用FFmpeg(自定义cmd)系列之官方API获取视频/音频信息(File方式)
Java使用FFmpeg(自定义cmd)系列之官方API获取视频/音频信息(URL方式)
Java使用FFmpeg(自定义cmd)系列之获取视频/音频时长(File文件方式)
Java使用FFmpeg(自定义cmd)系列之mp4转hsl编码m3u8
Java使用FFmpeg(自定义cmd)系列之MP4 转码 HLS m3u8 AES128 加密
使用ffmpeg 自定义的cmd命令MP4转hls编码m3u8文件,废话不多说,代码说话:
不用我们安装FFmpeg,项目自动依赖ffmpeg,已经有开源实现:
https://github.com/a-schild/jave2
姊妹篇:
Java使用FFmpeg(自定义cmd)系列之MP4 转码 HLS m3u8 AES128 加密
下面的代码基于:3.1.1 version
maven坐标:
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-all-deps</artifactId>
<version>3.1.1</version>
</dependency>
package com.hsj;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
/**
* @Description: 视频转m3u8
* @author: 何胜金 --qq:2356899074
* @date: 2021年6月26日 下午11:14:23
*/
public class FfmpegCmdHls4M3u8Test {
//执行成功0,失败1
private static int CODE_SUCCESS = 0;
private static int CODE_FAIL = 1;
//将荣耀视频测试.mp4转换荣耀视频测试_转码.mov格式
private static String cmd_mp4_2_ts = " -y -i D:\\test-ffmpeg\\荣耀视频测试.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb D:\\test-ffmpeg\\荣耀视频测试_ts.ts ";
//将荣耀视频测试_转码.mov添加水印(2356899074@qq.com)荣耀视频测试_转码_水印.mov
private static String cmd_ts_split = " -i D:\\test-ffmpeg\\荣耀视频测试_ts.ts -c copy -map 0 -f segment -segment_list D:\\test-ffmpeg\\荣耀视频测试_m3u8.m3u8 -segment_time 15 D:\\test-ffmpeg\\15s_%3d.ts ";
/**
* 第一步:视频整体转码ts
* 第二步:ts 文件切片
* @param: @param args
* @return: void
* @throws
*/
public static void main(String[] args) {
//异步执行,获取执行结果code
CompletableFuture<Integer> completableFutureTask = CompletableFuture.supplyAsync(() ->{
return cmdExecut(cmd_mp4_2_ts);
}, ThreadPoolExecutorUtils.pool)
.thenApplyAsync((Integer code)->{
if(CODE_SUCCESS != code) {return CODE_FAIL;}
System.out.println("第一步:视频整体转码ts,成功!");
Integer codeTmp = cmdExecut(cmd_ts_split);
if(CODE_SUCCESS != codeTmp) {return CODE_FAIL;}
System.out.println("第二步:ts 文件切片,成功!");
return codeTmp;
}, ThreadPoolExecutorUtils.pool);
//获取执行结果
//code=0表示正常
try {
System.out.println(String.format("获取最终执行结果:%s", completableFutureTask.get() == CODE_SUCCESS ? "成功!" : "失败!"));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
/**
*
* @Description: (执行ffmpeg自定义命令)
* @param: @param cmdStr
* @param: @return
* @return: Integer
* @throws
*/
public static Integer cmdExecut(String cmdStr) {
//code=0表示正常
Integer code = null;
FfmpegCmd ffmpegCmd = new FfmpegCmd();
/**
* 错误流
*/
InputStream errorStream = null;
try {
//destroyOnRuntimeShutdown表示是否立即关闭Runtime
//如果ffmpeg命令需要长时间执行,destroyOnRuntimeShutdown = false
//openIOStreams表示是不是需要打开输入输出流:
// inputStream = processWrapper.getInputStream();
// outputStream = processWrapper.getOutputStream();
// errorStream = processWrapper.getErrorStream();
ffmpegCmd.execute(false, true, cmdStr);
errorStream = ffmpegCmd.getErrorStream();
//打印过程
int len = 0;
while ((len=errorStream.read())!=-1){
System.out.print((char)len);
}
//code=0表示正常
code = ffmpegCmd.getProcessExitCode();
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
ffmpegCmd.close();
}
//返回
return code;
}
}