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

本文介绍如何利用AIR 2.0的NativeProcess API实现与本地操作系统的深度交互,通过具体示例DropFolders程序展示了如何调用HandBrake进行视频转码。

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.0 NativeProcess

因此,在我们开始之前,先了解下,什么是NativeProcess ActionScript 3.0 Reference for 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 程序,这还意味着在你的代码里采取一些特定的步骤,以解释不同操作系统的文件路径语法的不同。

 

HandBrake CLI

对于从来没有使用过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 -x ref=2:bframes=2:me=umh ”。临时使用的数列仅用来隔离每个自变量,这样可传递到构建的Vector 对象中,然后功过我们的NativeProcess 传递。

 

结论

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

 

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

 

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

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值