使用Javascript的Adobe Air,使程序在运行nativeProcess时等待

时间:2012-12-28 16:40:46

标签: javascript javascript-events air adobe

我试图通过使用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());
    }

1 个答案:

答案 0 :(得分:0)

这里有一个大纲,可以让你知道该怎么做:

  • directorySelected()方法中,将局部变量files(数组)提升为成员变量。这将使所选文件列表可用,以便其他方法可以访问它。
  • 删除for方法中的directorySelected()循环。不要在这里运行循环并尝试运行本机进程,而是调用一个新方法,让我们称之为dequeueFileAndRunNativeProcess()
  • 这个新的dequeueFileAndRunNativeProcess()方法应该检查files数组的长度,如果它大于0,它应该pop() files数组中的第一个文件并在其上执行原生进程。
  • onExit()方法中,再次调用dequeueFileAndRunNativeProcess()方法。

这里的想法是将运行本机进程的代码移动到一个方法,您可以从两个位置触发:一次在用户完成浏览文件后立即触发,然后在本机进程完成后再次工作。当files数组中没有更多文件时,该过程结束。