我试图通过使用nativeProcess运行ffprobe来从视频文件中提取元数据。下面的代码与一个文件的工作原理相同,但在尝试循环访问一系列文件时会导致错误。
我知道问题的原因是Air尝试在旧的nativeProcess完成之前启动它。我知道这与听空气有关.NativeProcessExitEvent.EXIT。我只是无法让它发挥作用。任何建议将不胜感激。
function fileOpen(){
var directory = air.File.userDirectory;
try
{
directory.browseForDirectory("Select Directory");
directory.addEventListener(air.Event.SELECT, directorySelected);
}
catch (error)
{
air.trace("Failed:", error.message)
}
function directorySelected(event)
{
directory = event.target ;
var files = directory.getDirectoryListing();
for(i=0; i < files.length; i++){
getMetadata(files[0].nativePath)
//wait here for nativeProcess to finish
}
}
}
function getMetadata(filePathIn){
if(air.NativeProcess.isSupported)
{
}
else
{
air.trace("NativeProcess not supported.");
}
fileIn = filePathIn.toString()
var nativeProcessStartupInfo = new air.NativeProcessStartupInfo();
var file = air.File.applicationStorageDirectory.resolvePath("ffprobe");
nativeProcessStartupInfo.executable = file;
args = new air.Vector["<String>"]();
args.push("-sexagesimal","-show_format","-loglevel","quiet","-show_streams","-print_format","json",filePathIn)
nativeProcessStartupInfo.arguments = args;
process = new air.NativeProcess();
process.start(nativeProcessStartupInfo);
process.addEventListener(air.ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(air.ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
process.addEventListener(air.NativeProcessExitEvent.EXIT, onExit);
process.addEventListener(air.IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
process.addEventListener(air.IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
}
function onOutputData()
{
var fileMetadataJSON = process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable);
air.trace(fileMetadataJSON)
}
function onErrorData(event)
{
air.trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable));
}
function onExit(event)
{
air.trace("Process exited with ", event.exitCode);
}
function onIOError(event)
{
air.trace(event.toString());
}
答案 0 :(得分:0)
这里有一个大纲,可以让你知道该怎么做:
directorySelected()
方法中,将局部变量files
(数组)提升为成员变量。这将使所选文件列表可用,以便其他方法可以访问它。for
方法中的directorySelected()
循环。不要在这里运行循环并尝试运行本机进程,而是调用一个新方法,让我们称之为dequeueFileAndRunNativeProcess()
。dequeueFileAndRunNativeProcess()
方法应该检查files
数组的长度,如果它大于0,它应该pop()
files
数组中的第一个文件并在其上执行原生进程。onExit()
方法中,再次调用dequeueFileAndRunNativeProcess()
方法。这里的想法是将运行本机进程的代码移动到一个方法,您可以从两个位置触发:一次在用户完成浏览文件后立即触发,然后在本机进程完成后再次工作。当files
数组中没有更多文件时,该过程结束。