我有一个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包装器。我还是得到了同样的错误。任何人都可以帮我解决这个问题。
答案 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}}。