windows将FileInputStream和FileOutputStream传递给ffmpeg进行转码(使用JAVEJava音频视频编码)
我正在试着转换一个*。将文件mov转换为*。使用JAVE的mp4文件,它调用ffmpeg。 输入文件和输出文件都采用InputStream和OutputStream格式。 这意味着我需要将InputStream和OutputStream作为ffmpeg的-I和-y参数传递。 我该怎么做
//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上),这将非常有用
谢谢
# 1 楼答案
那是行不通的
记住JAVE只是作为ffmpeg可执行文件的包装, 也就是说,你可以提供一些参数,比如目标编码、响度等 然后基本上告诉JAVE打电话给fmpeg并通过设置,你就进入了 使用Java方法作为ffmpeg可执行文件的参数
此步骤要求您指定的设置为 1.可序列化 2.ffmpeg可执行文件已知
现在你可以说至少有一些输入流,比如FileInputStream 在某种程度上是可序列化的,因为有一个对应的低级文件描述符 对于这个输入流,但是考虑BytErayInPixStudio——我不知道如何 Java在每个平台上实现,但不知何故,我怀疑是否存在 对应的文件描述符
然而,关键的一点是,ffmpeg可执行文件不应该也不应该 不知道InputStream类型的Java对象是什么。它能做的最好的 (至少在posix系统上)是一个整数(文件描述符) 并尝试从中读取数据。然而,当 使用文件描述符。例如,它可能是可查找的,如果是的话 例如,如果文件实际上表示从套接字读取的数据,则为文件
很高兴,在Posix系统上,每个进程至少有3个文件描述符, 这就是STDIN、STDOUT和STDERR。这对应于一个概念,你可以 从一个进程到另一个进程的管道输入/输出。我不知道这是否有效,也不知道如何有效 在Windows上,但在OSX或Linux上,您可以通过管道将数据传输到ffmpeg可执行文件中。这 实际上,这意味着您指示ffmpeg从STDIN文件描述符读取
遗憾的是,JAVE没有实现ffmpeg的这个特殊功能,即 没有将数据传输到ffmpegs标准数据的方法
FWIW。您可以编写一些本机(c/c++)代码,并使用 JNI(http://en.wikipedia.org/wiki/Java_Native_Interface)同时保存输入流和 还有一个输出流
您必须编写的本机代码可能包含ffmpeg源代码并使用它们 对从DecodeFeed读取的输入进行解码/转码。然后写回 解码源。出去
我在一个Android项目中做这件事,你可能想看看以供参考。 https://github.com/fscz/FFmpeg-Android
或者,您可以使用fork JAVE,自己实现这个特性。 您可能知道,Java提供了一种通过调用 运行时。执行官。此调用将返回 提供流程。getOutputStream。如果你写这个输出流,你 实际写入刚刚创建的进程的STDIN
见http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html 获取有关如何生成和写入进程的文档
见http://ffmpeg.org/ffmpeg.html 获取可用的命令行选项(包括从STDIN读取) 对于ffmpeg