ffmpeg返回非零退出状态。检查stdout Coldfusion

时间:2017-03-30 09:23:24

标签: video ffmpeg coldfusion

我有一个coldfusion应用程序。我正在通过ffmpeg和coldfusion从手机转换录制的视频。这是我正在运行的ffmpeg命令。

ffmpegPath -i“inputfile”-vcodec libx264 -acodec aac“OutputFile”

输出文件类型为mp4。我想用h.264和ACC声音将我的所有视频转换为mp4。这样它就可以在所有平台上运行。

我收到以下错误:

java.io.IOException: ffmpeg returned non-zero exit status. Check stdout.

这是我正在运行的CF代码。

<cfset resultLog        = "path\to\directory\testOuput_result.log">
<cfset errorLog         = "path\to\directory\testOuput_error.log">
<cfset results  = structNew()> 
        <cfscript>
            try {  
                runtime = createObject("java", "java.lang.Runtime").getRuntime();
                command = 'ffmpegPath -i "inputfile" -vcodec libx264 -acodec aac "OutputFile"';
                process = runtime.exec(#command#);
                results.errorLogSuccess = processStream(process.getErrorStream(), errorLog);  
                results.resultLogSuccess = processStream(process.getInputStream(), resultLog);  
                results.exitCode = process.waitFor();  
            }  
            catch(exception e) {  
                results.status = e;      
            }  
        </cfscript>
<cffunction name="processStream" access="public" output="false" returntype="boolean" hint="Returns true if stream was successfully processed">  
    <cfargument name="in" type="any" required="true" hint="java.io.InputStream object">  
    <cfargument name="logPath" type="string" required="false" default="" hint="Full path to LogFile">  
    <cfset var out = "">  
    <cfset var writer = "">  
    <cfset var reader = "">  
    <cfset var buffered = "">  
    <cfset var line = "">  
    <cfset var sendToFile = false>  
    <cfset var errorFound = false>  

    <cfscript>  
        if ( len(trim(arguments.logPath)) ) {  
            out = createObject("java", "java.io.FileOutputStream").init(arguments.logPath);  
            writer = createObject("java", "java.io.PrintWriter").init(out);  
            sendToFile = true;  
        }  

        reader = createObject("java", "java.io.InputStreamReader").init(arguments.in);  
        buffered = createObject("java", "java.io.BufferedReader").init(reader);  
        line = buffered.readLine();  
        while ( IsDefined("line") ) {  
            if (sendToFile) {  
                writer.println(line);  
            }  
            line = buffered.readLine();  
        }      
           if (sendToFile) {  
           errorFound = writer.checkError();  
           writer.flush();  
           writer.close();  
        }  
    </cfscript>  
    <!--- return true if no errors found. --->  
    <cfreturn (NOT errorFound)>  
</cffunction> 

我也使用了不同的ffmpeg.exe,但是出现了同样的错误。我在coldfusion中也使用了ffmpeg-cli-wrapper java包装器。我还是得到了同样的错误。任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

我可以解决此问题。问题出在inputfile路径中。我通过将inputfile的绝对路径传递给ffmpeg

来解决这个问题

答案 1 :(得分:1)

与错误无关,但您确定确实需要Runtime.exec()吗?这通常是矫枉过正的。大多数应用程序都可以使用<cfexecute>调用,an issue with cfexecute and ffmpeg.exe基本上是Runtime.exec()的包装器,它只执行相同的操作,但代码更少。

由于早期版本的cfexecute没有捕获StdErr,因此在CF8中有cfexecute documentation回路。但是,这在CF8更新中得到了解决。假设您使用的是最新版本的CF,它应该可以直接使用。没有经过测试,但有些内容如下:

注意:注意所有文件的绝对路径的使用

<!--- change to the appropriate timeout --->
<cfexecute name="c:\path\to\ffmpeg.exe" 
    arguments=' -i "c:\path\to\in.file" -vcodec libx264 -acodec aac "c:\path\to\out.file"'
    timeout="120" 
    variable="result"
    errorVariable="errorMessage"
    /> 

<!--- Display results --->
<cfoutput>
   result = #result#
   errorVariable = #errorVariable #
</cfoutput>

有关参数和语法的更多详细信息,请参阅{{3}}。