Java使用FFmpeg(自定义cmd)系列之mp4转hsl编码m3u8

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;
    }
    
}


gitee:https://gitee.com/hsjjsh123/test-ffmpeg

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值