2012-12-28 65 views
0

我試圖通過使用nativeProcess運行ffprobe來從視頻文件中提取元數據。下面的代碼就像它應該爲一個文件一樣工作,但是當試圖循環一系列文件時會導致錯誤。使用Javascript的Adobe Air,使程序在運行nativeProcess時等待

我知道問題的原因是Air試圖在舊版本完成之前啓動新的nativeProcess。我知道這是與聆聽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()); 
    } 

回答

0

這裏的大綱應該給你做什麼的想法:

  • 在你directorySelected()方法,促進局部變量files(數組)的成員變量。這將使所選文件的列表可用,以便其他方法可以訪問它。
  • 刪除directorySelected()方法中的for循環。不要運行循環並試圖在這裏運行本地進程,而是調用一個新方法,我們稱之爲dequeueFileAndRunNativeProcess()
  • 這個新的dequeueFileAndRunNativeProcess()方法應該檢查files數組的長度,如果數組大於0,它應該是files數組中的第一個文件,並在其上執行本機進程。
  • 在您的onExit()方法中,再次調用dequeueFileAndRunNativeProcess()方法。

這裏的想法是將運行本機進程的代碼移動到一個可以從兩個地方觸發的方法:一次在用戶完成瀏覽文件後立即執行,然後在本機進程完成後再次執行。該過程在files陣列中沒有其他文件時結束。

+1

這是一個好主意。謝謝你的幫助。 –

+0

這工作得很好。謝謝。 –

相關問題