0

ffprobeを使用して実行することにより、ビデオファイルからメタデータを抽出しようとしていますnativeProcess。以下のコードは、1つのファイルの場合と同じように機能しますが、一連のファイルをループしようとするとエラーが発生します。

nativeProcess問題の原因は、古いものが終了する前にAirが新しいものを開始しようとすることです。私はそれがを聞くことと関係があることを知っていair.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());
    }
    
4

1 に答える 1

0

ここにあなたに何をすべきかについての考えを与えるべき概要があります:

  • メソッドで、ローカル変数(配列)をメンバー変数directorySelected()にプロモートします。filesこれにより、選択されたファイルのリストが利用可能になり、他のメソッドがアクセスできるようになります。
  • forメソッドのループを削除しますdirectorySelected()。ここでループを実行してネイティブプロセスを実行しようとする代わりに、新しいメソッドを呼び出してみましょうdequeueFileAndRunNativeProcess()
  • この新しいdequeueFileAndRunNativeProcess()メソッドは、配列の長さをチェックする必要がありfiles、0より大きい場合はpop()、配列の最初のファイルであり、filesその上でネイティブプロセスを実行する必要があります。
  • メソッドで、メソッドを再度onExit()呼び出します。dequeueFileAndRunNativeProcess()

ここでの考え方は、ネイティブプロセスを実行するコードを、ユーザーがファイルの参照を終了した直後と、ネイティブプロセスが機能を終了した後の、2つの場所からトリガーできるメソッドに移動することです。files配列にファイルがなくなると、プロセスは終了します。

于 2012-12-28T19:34:01.373 に答える