有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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