您的位置:首页 > 大数据 > 人工智能

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

2010-09-25 16:08 381 查看
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/



虽然有几个范例可说明如何连接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
例子中,我们与headless
的Handbrake CLI
(正好也穿过平台)建立交互界面。为了利用这个功能,当打包分配时,我们为每个平台版本都准备不同的一套文件。有了大量的AIR
程序,这还意味着在你的代码里采取一些特定的步骤,以解释不同操作系统的文件路径语法的不同。

HandBrake
CLI

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

使用Dropfolders
拓展HandBrake

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

代码范例

这里有一个来自DropFolders
的ActionScript
范例,设置了与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
吗?我录制了一个视频,详细说明了从安装,到配置预设及处理文件等过程。

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

本文译自:http://insideria.com/2010/06/air-20-nativeprocess-api---wha.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: