我正在尝试使用调用 ffmpeg 的 JAVE 将 *.mov 文件转码为 *.mp4 文件。 输入文件和输出文件都是 InputStream 和 OutputStream 形式。 这意味着我需要将 InputStream 和 OutputStream 作为 -i 和 -y 参数传递给 ffmpeg。 我该怎么做?
//Read a movfile.mov converted into a FileInputStream
InputStream fileInputStream = getFileInputStream();
OutputStream fileOutputStream = new FileOutputStrea(outputMP4File) //Output
Process p = Runtime.exec("ffmpeg -i - -y -");
InputStream pInStrm = p.getInputStream();
OutputStream pOutStrm = p.getOutputStream();
int vin = 0, vout = 0;
Thread read = new Thread() {
byte[] buff = new byte[4096];
void run() {
while ((vin=fileInputStream.read(buf))!=-1) {
pOutStrm.write(buf, 0, vin);
}
}
}; read.start();
Thread write = new Thread() {
byte[] buff = new byte[4096];
void run() {
while ((vout=pInStrm.read(buf))!=-1) {
fileOutputStream.write(buf, 0, vout);
}
}
}; write.start();
但我不断收到“IOException:管道已关闭”错误。有人可以帮帮我吗? 或者,如果有任何 JAVA API 可以执行此代码转换(在 Windows 和 RedHat Linux 上),那将非常有帮助
谢谢
最佳答案
那是行不通的。
请记住,JAVE 仅充当 ffmpeg 可执行文件的包装器, 那就是你提供参数,比如目标编码、响度等,并且 然后基本上告诉 JAVE 调用 fmpeg 并传递设置,你输入 使用 Java 方法作为 ffmpeg 可执行文件的参数。
此步骤需要您指定的设置是 1.可序列化 2.已知为ffmpeg可执行文件
现在你可以争辩说至少有一些 InputStreams,比如 FileInputStream 以某种方式可序列化,因为有一个低级文件描述符对应 到这个 InputStream,但考虑一个 ByteArrayInputStream - 我不知道如何 Java 在每个平台上实现,但我有点怀疑,是否有 相应的文件描述符。
然而,关键的一点是,ffmpeg 可执行文件不应该也不应该 不知道 InputStream 类型的 Java 对象是什么。它能做到的最好 (至少在 posix 系统上)取一个整数(文件描述符 E) 并尝试从中读取数据。然而,很多事情都可能出错,当 使用文件描述符。例如,它可能是可搜索的,如果它是 一个文件,例如与否,如果它实际上代表从套接字读取的数据。
很高兴,在 Posix 系统上,每个进程至少有 3 个文件描述符, 即 STDIN、STDOUT 和 STDERR。这对应于一个概念,您可以 从一个进程到另一个进程的管道输入/输出。我不知道这是否或如何工作 在 Windows 上,但在 OSX 或 Linux 上,您可以将数据通过管道传输到 ffmpeg 可执行文件中。这个 实际上意味着,您指示 ffmpeg 从 STDIN 文件描述符中读取。
遗憾的是,JAVE并没有实现ffmpeg的这个特殊特性,也就是说,有 没有方法,将数据通过管道传输到 ffmpegs STDIN。
FWIW。您可以编写一些 native (c/c++) 代码并传递一个 Java 对象“DecodeFeed”,使用 JNI ( http://en.wikipedia.org/wiki/Java_Native_Interface ) 包含一个 Inputstream 和一个输出流
您必须编写的 native 代码可以包含 ffmpeg 源代码并使用它们 解码/转码从 DecodeFeed.in 读取的输入,然后写回 DecodeFeed.out.
我是在一个Android项目中做的,你可能想看看以供引用。 https://github.com/fscz/FFmpeg-Android
或者,您可以派生 JAVE 并自己实现此功能。 正如您可能知道的那样,Java 提供了一种通过调用来运行可执行文件的方法 运行时.exec。此调用将返回 Process 类的一个实例,该实例 提供 Process.getOutputStream。如果您写入此 Outputstream,您 实际上写入刚刚创建的进程的 STDIN。
参见 http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html 有关如何生成和写入进程的文档。
并查看 http://ffmpeg.org/ffmpeg.html 对于可用的命令行选项(包括从 STDIN 读取) 对于 ffmpeg。
关于java - 将FileInputStream和FileOutputStream传给ffmpeg进行转码(使用JAVE-Java音视频编码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345678/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg