java - 从Java开始在OSX(AVFoundation)上的ffmpeg屏幕截图问题
问题描述
我想在 OSX 上从 Java 启动屏幕捕获命令,如下所述:https ://trac.ffmpeg.org/wiki/Capture/Desktop
它在终端上运行良好。但是当我使用 Java 启动完全相同的命令时,Runtime.exec
我得到以下输出:
[AVFoundation input device @ 0x7f892f500400] Video device not found
'1:': Input/output error
假设我运行的命令存储为String cmd = "ffmpeg -f avfoundation -i '1:' output.mkv"
. 我尝试过的事情:
使用
ffmpeg -f avfoundation -list_devices true -i ""
我断言这1
是屏幕的正确索引。我也通过它运行了该命令Runtime.exec
,它提供的索引与我从终端运行它时的索引相同。'1:'
无论我使用还是都没有区别"\"1:\""
。好吧,在后一种情况下,它说"1:": Input/output error
。两种变体都在终端中工作。Runtime.getRuntime().exec(cmd)
我打电话或 打电话Runtime.getRuntime().exec(cmd.split(" "))
也没有什么区别(new ProcessBuilder(cmd.split(" "))).start()
。原则上它启动 ffmpeg 并以上面给出的输出结束。我是否读出 ffmpeg 的输出似乎没有什么区别(通过
process.getErrorStream()
)唯一可行的是将命令存储在文件中,例如 in
run.sh
然后调用 egRuntime.getRuntime().exec("run.sh")
。应该可以在没有这种解决方法的情况下从 Java 正确执行此操作,对吧?我究竟做错了什么?在 Linux 上,使用例如
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 output.mp4
它可以正常工作,从命令行或从 Java,使用Runtime.exec
和 viaProcessBuilder
。
我没有在 Windows 上尝试过。在 OSX(Mojave 10.14.5)上,我在 Linux(Mint 18、64 位)Java 8 上使用了 Java 12。在 Linux 上尝试使用 Java 12 会有些麻烦,我怀疑 Java 版本不是原因,因为 avfoundation vs x11grab 是更显着的区别。
解决方案
推荐阅读
- vue.js - 将 Vue 过滤器显式导入组件
- php - Foreach 中的 JSON 编码
- ios - iOS - 为部分文本添加荧光笔效果
- objective-c - 在 imageview 顶部添加一个按钮,类似于 iPhone 配置文件设置页面
- javascript - 如何使用 express 修复 node.js 中的 ER_PARSE_ERROR
- google-apps-script - 如何在谷歌脚本中使用for循环发送电子邮件?
- javascript - CKEDIOTR 提及 - 突出显示选定的名称
- javascript - React + Redux:组件不会在状态更改时重新渲染
- excel - 返回与范围内匹配相关的列字母
- scipy - 安装 scipy 时出错:“损坏的工具链”