将FileInputStream和FileOutputStream传递给ffmpeg进行转码(使用JAVE Java音频视频编码)
我正在尝试使用JAVE将*.mov文件转换为*.mp4文件,JAVE调用ffmpeg。 输入文件和输出文件都采用InputStream和OutputStream格式。 这意味着我需要将InputStream和OutputStream作为ffmpeg的-I和-y参数传递。 我该怎么做将FileInputStream和FileOutputStream传递给ffmpeg进行转码(使用JAVE Java音频视频编码),java,windows,linux,ffmpeg,transcode,Java,Windows,Linux,Ffmpeg,Transcode,我正在尝试使用JAVE将*.mov文件转换为*.mp4文件,JAVE调用ffmpeg。 输入文件和输出文件都采用InputStream和OutputStream格式。 这意味着我需要将InputStream和OutputStream作为ffmpeg的-I和-y参数传递。 我该怎么做 //Read a movfile.mov converted into a FileInputStream InputStream fileInputStream = getFileInputSt
//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可执行文件已知 现在你可以说至少有一些输入流,比如FileInputStream 以某种方式是可序列化的,因为有一个对应的低级文件描述符 对于这个输入流,但是考虑BytErayInPixStudio——我不知道如何 Java在每个平台上实现,但我怀疑是否存在 相应的文件描述符 然而,关键的一点是,ffmpeg可执行文件不应该也不应该 不知道InputStream类型的Java对象是什么。它能做的最好的 (至少在posix系统上)是一个整数(文件描述符) 并尝试从中读取数据。然而,很多事情可能会出问题,当 使用文件描述符。例如,如果是,它可能是可查找的 一个文件,例如,如果它实际上表示从套接字读取的数据,那么它是否表示该文件 很高兴,在Posix系统上,每个进程至少有3个文件描述符, 这就是标准,标准和标准。这对应于一个概念,您可以 从一个进程到另一个进程的管道输入/输出。我不知道这是不是或者是怎么回事 在Windows上,但在OSX或Linux上,您可以通过管道将数据传输到ffmpeg可执行文件中。这 实际上,这意味着您指示ffmpeg从STDIN文件描述符读取 遗憾的是,JAVE没有实现ffmpeg的这个特性,即 没有方法将数据管道化到ffmpegs STDIN中 FWIW。您可以编写一些本机(c/c++)代码,并使用 同时保存Inputstream和 和一个输出流 您必须编写的本机代码可能包含ffmpeg源代码并使用它们 对从DecodeFeed.in读取然后写回的输入进行解码/转码 解码输出 我在一个Android项目中这样做,你可能想看看以供参考。 或者,您可以使用fork JAVE并自己实现这个特性。 您可能知道,Java提供了一种通过调用 Runtime.exec。此调用将返回 提供Process.getOutputStream。如果写入此输出流,则 实际写入刚刚创建的进程的STDIN 看 有关如何生成和写入进程的文档 看看 有关可用的命令行选项(包括从STDIN读取) 对于ffmpeg