AIR 2.0 NativeProcess API –它对什么有所帮助呢?

来源:互联网 发布:python运行py文件 编辑:程序博客网 时间:2024/05/05 01:36

Adobe Flash Builder 4 简体中文正式版 Windows版点击下载:http://g.csdn.net/5134151

Adobe Flash Builder 4 简体中文正式版 Mac版点击下载:http://g.csdn.net/5134152

Adobe 在线课堂:http://adobev.csdn.net/zx/index.html
Adobe平台技术峰会课程视频:http://adobev.csdn.net/

 

DropFolders

 

虽然有几个范例可说明如何连接AIR程序和本地操作系统流程,大部分范例都还是基本的“Hello World”范例,或者正好是纯理论性的。我倒是有一两个真实的程序范例,以一种有意义的方式利用了这种功能。在本文中,我将讨论DropFolders程序,它利用AIR 2.0 NativeProcess APIs,从而使得采用HandBrake成为了一个成为流程化的便捷过程。

 

AIR 2.0NativeProcess

因此,在我们开始之前,先了解下,什么是NativeProcess ActionScript 3.0 Referencefor the Adobe Flash Platform文件对此进行了很好的总结:

NativeProcess类提供命令行整合和通常的发送功能。NativeProcess类让AIR程序在主机操作系统上执行本地流程。AIR程序能监控流程的标准输入(stdin)和标准输出(stdout)流,及流程的标准错误(stderr)流。

基本上,这个新的API让你的程序能与主机上运行的几乎所有的流程通讯。这可以是一个操作系统核心流程或一个第三方安装的程序,如HandBrake

 

需要考虑的事项

很酷,不是么?这提供了很多可能性,但是也对利用NativeProcess的程序的分布造成了一些限制。当处理本地代码时,AIR程序必须为特定目标平台进行编译。这就意味着,你不能仅仅就是编辑一个.air file,随后执行之。执行NativeProcess最简单的方式就是确定一个目标平台(Windows, Mac OSX, Linux),然后为该平台进行编译。在DropFolders例子中,我们与headlessHandbrake CLI(正好也穿过平台)建立交互界面。为了利用这个功能,当打包分配时,我们为每个平台版本都准备不同的一套文件。有了大量的AIR程序,这还意味着在你的代码里采取一些特定的步骤,以解释不同操作系统的文件路径语法的不同。

 

HandBrakeCLI

对于从来没有使用过HandBrake的用户来说,这是一个很出色的视频转码工具,用户可以用来将各类文件格式转换成高清晰度的H.264(通过使用从GUI版本可配置的多元设置或通过命令行界面作为自变量)。在丹佛大学,我们使用HandBrake处理CourseMedia程序使用的视频,或通过我们的Flash Media Server实例的流的视频。然而,HandBrake GUI不接受用于视频转码流程自动化的可配置“watch”和“destination”文件夹的概念。

 

使用Dropfolders拓展HandBrake

有时候,懒惰反倒会引发创新。通常,我们可以用HandBrake帮助别人,也可以快速设定一些定制化的设置。但是在一个特别案例里,我们遇到了一批用户,他们要求完全不予操作转码流程。那怎么办呢?在本例中,他们就是要直接从视频设备中提取一些文件,放入到网络共享。我们构建DropFolders,以在桌面和服务器环境内都启动该工作流。在服务器上设置稍微复杂些(这里我就不深入讨论了),但是两个环境中启动的思路是一样的。当新的文件被监测到时,定义一个不断被程序监控的监视文件(watch folder)-根据特定的预设进行处理,将派生文件放入目录内,在这里一个单独的显示程序会找到它们。

 

代码范例

 

这里有一个来自DropFoldersActionScript范例,设置了与HandBrake的连接,并且构建了一些通讯关口。大部分是基于程序的TranscodeController类。

 

你会需要导入以下类:

import flash.filesystem.File;

import flash.desktop.NativeProcess;

import flash.desktop.NativeProcessStartupInfo;

import flash.events.NativeProcessExitEvent;

import flash.events.ProgressEvent;

import flash.events.IOErrorEvent;

import mx.controls.Alert;

宣布一些变量,基于OS设置环境:

 

private var nativeProcess:NativeProcess;

private var nativeProcessStartupInfo:NativeProcessStartupInfo;

private var hb:File;

private var hbCLI:String;

private var pathDivider:String;

private var os:String;

 

private function setupController() {

         os = Capabilities.os.substr(0, 3).toLowerCase();

         if(NativeProcess.isSupported){

                 if(os == "win"){

                          pathDivider= "//";

                          hbCLI= "HandBrake.exe"

                 }else{

                          pathDivider= "/";

                          hbCLI= "HandBrake.dmg"

                 }

                 establishConnection();

         }else{

                 Alert.show("Not Good.");

         }

}

现在,设置NativeProcess 关联:

private function establishConnection():void {

         hb= File.applicationDirectory;

         hb= hb.resolvePath("HandBrake" + pathDivider + hbCLI);

         nativeProcess= new NativeProcess();

         nativeProcessStartupInfo= new NativeProcessStartupInfo();

}

 

现在,我们需要做的就是,指向HandBrake,在Vector对象范围内设置我们的自变量,添加一些事件监听器,启动NativeProcess

 

public function invokeHandBrake(i:String, o:String, a:String):void {

     nativeProcessStartupInfo.executable = hb;

     var processArgs:Vector.<String> = new Vector.<String>();

     processArgs.push("-i");

     processArgs.push(i);

     processArgs.push("-o");

     processArgs.push(o);

     var argArray:Array = a.split(" ");

     for(var j:int = 0; j<argArray.length-1; j++){

          processArgs.push(argArray[j]);

      }

     nativeProcessStartupInfo.arguments = processArgs;

    nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,onStandardOutputData);

    nativeProcess.addEventListener(ProgressEvent.STANDARD_ERROR_DATA,onStandardErrorData);

    nativeProcess.addEventListener(NativeProcessExitEvent.EXIT, onExit);

    nativeProcess.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR,onOutputIOError);

    nativeProcess.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR,onStandardIOError);

     nativeProcess.start(nativeProcessStartupInfo);

}

 

DropFolders中,几个关于自变量的标注:”I”是输入文件,”d”是通过转码过程创建的文件,而”a”HandBrake期待的一串自变量,以执行适当的转码。通常,其格式类似于“-e x264-b 1500 -a 1 -E faac -B 160 -R Auto -6 dpl2 -f mp4 -p -m -2 -T -xref=2:bframes=2:me=umh”。临时使用的数列仅用来隔离每个自变量,这样可传递到构建的Vector对象中,然后功过我们的NativeProcess传递。

 

结论

AIR 2.0AIR 1.5的升级版,添加了NativeProcess,从而提供了更多的可能性。 在没有AIR 2.0之前,想想要执行这个任务,需要多少跨操作系统的工作。Flash Platform的一个优势就是,它可以让有能力的开发人员有效地跨平台,跨设备工作。这些添加到本地操作系统流程的新内容将之提升到了一个全新的高度。

 

有兴趣看看使用中的DropFolders吗?我录制了一个视频,详细说明了从安装,到配置预设及处理文件等过程。

 

我将讨论DropFoldersAdobe MAX 2010上关于AIR的其它使用。如果你想了解根多,请查阅我的文章。

 

本文译自:http://insideria.com/2010/06/air-20-nativeprocess-api---wha.html