码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java调用ffmpeg处理视频,并记录下遇到的坑


    目录

    • 需求
    • 基于JavaCV跨平台执行ffmpeg命令[^1]
    • 坑一 内存不足
    • 坑二 多个ffmpeg进程并行导致IO负载大,进而导致io error?
    • 坑三 使用Java操作ffmpeg时,有时会卡死
    • 坑四 Process的waitFor死锁问题及解决办法

    需求

    给透明背景的视频自动叠加一张背景图片

    基于JavaCV跨平台执行ffmpeg命令1

    我测试发现的本需求的最小依赖:

    
        <dependency>
          <groupId>org.bytedecogroupId>
          <artifactId>ffmpeg-platform-gplartifactId>
          <version>5.0-1.5.7version>
        dependency>
    

    核心代码:

      String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
      String tempFilePath = newVideoName;
      ProcessBuilder pb = new ProcessBuilder(ffmpeg,
          "-y", "-i", BACKGROUND_PNG, "-c:v", "libvpx-vp9", "-i", aliVideoUrl, "-filter_complex",
          "[0][1]overlay=0:0[video2];[video2]select=between(n\\,1\\,54000)", "-b:v", "2m", "-r",
          "30", "-c:v", "libx264", "-pix_fmt", "yuv420p", "-profile:v", "high", "-preset:v",
          "veryslow", "-tune", "film", "-level", "4.2", tempFilePath);
      pb.inheritIO().start().waitFor();
      File tempFile = new File(tempFilePath);
    

    坑一 内存不足

    服务器内存不足导致合成视频实际失败,许多的合成文件只有48B,但是没有与之相关的错误日志。
    每个服务器节点原来只有2G内存,扩容后解决。

    坑二 多个ffmpeg进程并行导致IO负载大,进而导致io error?

    这只是一种推测。现象是我会有多个Java线程,每个线程都来调用ffmpeg命令。合成的视频有概率缺失后面一段,并可以在日志中观察到io error, read error。源视频越大,Java线程数越多,出现这种情况的概率越大。当我把Java程序改为单线程,就没有这种问题了。但当我尝试用iostat命令去服务器节点观察IO状态时,并没有观察到所谓IO负载大的证据。2

    坑三 使用Java操作ffmpeg时,有时会卡死

    只发生在我本地Mac,在服务器没有出现过。我找了很久原因,最后发现是我的Mac跑了一段时间后自动休眠了。。不过也记录下很多人都遇到过的这个坑吧:

    坑四 Process的waitFor死锁问题及解决办法

    大意是:当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,而Java的waitfor()是阻塞等待子进程完成的。所以会最终造成阻塞在waitfor()这里。解决的主要思路是Java要及时消费这个缓冲区的io流,或者直接不让ffmpeg输出日志。一些参考:

    使用Procees+Runtime操作ffmpeg时,执行比较大的文件操作会卡死,但cmd打开ffmpeg能正常执行

    Java process.waitFor() 卡死问题里提到了,也可以直接给ffmpeg命令加上-loglevel quiet参数来不让输出日志。

    Process的waitFor死锁问题及解决办法


    1. 如何跨平台调用ffmpeg?史上最简单基于JavaCV跨平台执行ffmpeg命令 ↩︎

    2. Linux IO实时监控iostat命令详解 ↩︎

  • 相关阅读:
    【DesignMode】观察者模式(Observer Pattern)
    基于JMH做Benchmark基准测试
    面向对象分析:如何建立动态模型?状态图(单个对象建模),状态是对影响对象行为的属性值的一种抽象,它规定了对象对( 输入事件 )的响应方式,
    【MM小贴士】从 purchase 到 payment 全流程演示
    Hadoop核心机制详细解析
    Git,命令大全
    C++vector的简单模拟实现
    8月《中国数据库行业分析报告》已发布,聚焦数据仓库、首发【全球数据仓库产业图谱】
    23种设计模式(十八)迭代器模式(阁瑞钛伦特软件-九耶实训)
    4-Arm PEG-DSPE,MW:2000,四臂-聚乙二醇-磷脂仅供科研实验使用
  • 原文地址:https://blog.csdn.net/qq_23204557/article/details/127104085
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号