常用视频截图的俩种方式

1.ffmpeg

这种方式需要我们安装ffmpeg这个客户端软件!然后在java代码中打开程序并且截图!

直接上代码:---------》ffmpegPath:ffmpeg安装的路径  upFilePath:视频的路径 (可以是线上地址) mediaPicPath:截图想要存放的路径

 String url = AbstractOssClientUtil.putObject(picture.getInputStream(), FILE_PATH,      AbstractOssClientUtil.getFileName(fileNa), picture.getSize());
 Map<String, String> map = new HashMap();
 //保存在服务器的路径
 String tempUrl="/tmp/"+System.currentTimeMillis()+".jpg";
 PictureInterceptionUtils.handler("/spring/ffmpeg/bin/ffmpeg", url, tempUrl);
public static void handler(String ffmpegPath,String upFilePath,String mediaPicPath){
    List cutpic = new ArrayList();
    cutpic.add(ffmpegPath); // 视频提取工具的位置
    cutpic.add("-i"); // 添加参数"-i",该参数指定要转换的文件
    cutpic.add(upFilePath); // 视频文件路径
    cutpic.add("-y");
    cutpic.add("-f");
    cutpic.add("image2");
    cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间
    cutpic.add("1"); // 添加起始时间为第1秒
    cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间
    cutpic.add("0.001"); // 添加持续时间为1毫秒
    cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图片大小
    cutpic.add("600*600"); // 添加截取的图片大小为800*600
    cutpic.add(mediaPicPath); // 添加截取的图片的保存路径
    boolean mark = true;
    ProcessBuilder builder = new ProcessBuilder();
    try {
        builder.command(cutpic);
        builder.redirectErrorStream(true);
        // 如果此属性为 true,则任何由通过此对象的 start() 方法启动的后续子进程生成的错误输出都将与标准输出合并,
        //因此两者均可使用 Process.getInputStream() 方法读取。这使得关联错误消息和相应的输出变得更容易
        builder.start();
    } catch (Exception e) {
        mark = false;
        System.out.println(e);
        e.printStackTrace();
    }
}

截图出现的小问题:

java.io.IOException: No such file or directory

我们在程序中通常是截图和图片上传放在一起来做!而截图我们是需要去让ffmpeg来做,这个时候ffmpeg便占用了一个进程,而本身java自己的程序也占用一个进程!如果放在一起做的话,可能存在一种情况就是我图片还没有截完,便执行上传操作!导致出现这个问题!

解决方案:
1.在截完之后加一个休眠的操作,直接上代码!

PictureInterceptionUtils.handler("/spring/ffmpeg/bin/ffmpeg", url, tempUrl);
//休眠,等到图截完之后再去做操作
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    System.out.println("4l");
    e.printStackTrace();
}
File file = new File(tempUrl);
InputStream fileInputStream = new FileInputStream(file);
//上传图片
String coverUrl = AbstractOssClientUtil.putObject1(fileInputStream, FILE_PATH, AbstractOssClientUtil.getFileName(file.getName()), file.length());

2.通过阿里云截图的方式,详情参考https://help.aliyun.com/document_detail/64555.html?spm=a2c4g.11186623.6.1030.T2kZxj

猜你喜欢

转载自blog.csdn.net/weixin_41247813/article/details/82859066
今日推荐