Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将FileInputStream和FileOutputStream传递给ffmpeg进行转码(使用JAVE Java音频视频编码)_Java_Windows_Linux_Ffmpeg_Transcode - Fatal编程技术网

将FileInputStream和FileOutputStream传递给ffmpeg进行转码(使用JAVE Java音频视频编码)

将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

我正在尝试使用JAVE将*.mov文件转换为*.mp4文件,JAVE调用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上),这将非常有用


谢谢,那样不行

记住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