解决ffmpeg将多段视频裁剪拼接后卡顿现象

合并

将下载的ts流名称按照顺序记录在一个txt文件中,然后使用命令

ffmpeg.exe -f concat -i ./your.txt -c copy ./output.mkv
ffmpeg.exe -i output.mkv output.mp4

步骤:

  • 将整段视频转成ts流
ffmpeg -y -i abc.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb abc.ts

发现无论是直接截取mp4或者ts,前三秒都是卡顿状态
解决:截取时先对视频重新编码,再截取,编码时长只是针对要截取视频片段的长度

ffmpeg命令:ffmpeg -ss 00:01:00 -t 140 -i Y天屠龙记2019-14.mp4 -c:v libx264 -c:a aac -strict experimental 
-b:a 98k out2.mp4

问题:这种方式jvm会一直占用着几个视频
原因:调用命令行后,程序可能正常运行 一会后,然后程序block住,后台进程ffmpeg还没死。Runtime.exec()执行时JVM会产生一个子进程,该进程与JVM建立三个通道链接:标准输入,标准输出,标准错误。Java本地的系统对标准输入和输出所提供的缓冲池有限,所以错误的对标准输出快速的写入和从标准输入快速的读入都有可能造成子进程死锁。子进程的输出流,也就是JVM的输入流。子进程不断向控制台输出,如果Java没有把输入流及时清空,会导致缓存区满,导致死锁。
解决:解决办法就是及时清空输入流,开两个线程把process.getInputStream()和process.getErrorStream()读出来就可以。对于ffmpeg只需要process.getErrorStream()读出来就可以了。

        String line = "";
        Process process = Runtime.getRuntime().exec(command);
        BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        process.waitFor();
  • 将截取的视频片段名称写入到一个txt文本文档中
file 'out1.mp4'
file 'out2.mp4'
file 'out3.mp4'
file 'out4.mp4'
  • 将mp4片段合并成一个视频
ffmpeg -f concat -i out.txt -c copy out.mp4

总结

控制器循环调用ffmpeg截取视频时,可以将生成的文件名追加到txt文本文档中,最后再统一合并。

你可能感兴趣的:(解决ffmpeg将多段视频裁剪拼接后卡顿现象)