使用AIR 2的本机进程API来创建屏幕录制程序.doc_第1页
使用AIR 2的本机进程API来创建屏幕录制程序.doc_第2页
使用AIR 2的本机进程API来创建屏幕录制程序.doc_第3页
使用AIR 2的本机进程API来创建屏幕录制程序.doc_第4页
使用AIR 2的本机进程API来创建屏幕录制程序.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用AIR 2的本机进程API来创建屏幕录制程序公司:Adobe要求必备知识一定的 ActionScript 经验将会有所帮助。用户水平中级必备产品 Flash Builder(下载试用版)示例文件 screenrecording.zip随着 AIR 2 的发布,Adobe 为开发人员提供了呼声最高的功能之一启动本地进程并与之通信的能力。您依然可以利用 Adobe AIR,通过 Flash 平台丰富的表现能力和易用性构建美观的用户界面。但您现在可以构建全新的应用程序,融合现有桌面应用程序来打造全新内容。这个简洁的 API 加载项将成为所有类型应用程序的支持动力。如果您此前在项目中由于需要本地 AIR API 中未包含的某些功能而受阻,如今已没有等待的理由了,因为您实际上可以自行扩展 AIR。为了演示这种新功能,我创建了一个屏幕录制应用程序,与两个广为人知的桌面应用程序交互:FFmpeg 和 VLC。设置项目按照以下步骤在 Flash Builder 中设置项目:1. 下载并解压缩本文的示例文件。2. 在 Flash Builder 中选择 File Import Flex Project (FXP)。3. 浏览并选择您刚刚解压的 screenrecording.fxp 文件。4. 单击 Finish。要生成此项目,您还需要安装 AIR 2 SDK。5. 从 Adobe Labs 下载AIR 2 SDK。6. 按照发行说明中如何使用 Flex SDK 覆盖您的 Adobe AIR SDK中的说明进行操作。接下来,您需要更新编译器设置,使用新 SDK。7. 在 Package Explorer 中右击项目,并选择 Properties。8. 选择 Flex Compiler,选择 Use A Specific SDK,随后选择新的 SDK。9. 运行 Project Clean。在项目中,您将发现两个应用程序(Screenrecording_VideoOnly.mxml 和 Screenrecording_VideoSound.mxml)。第一个应用程序展示如何录制屏幕。第二个应用程序基于第一个应用程序,还添加了录制声音的能力。使用 VLC 录制屏幕您可能了解 VLC 作为媒体播放器,能够播放几乎全部可用音频和视频文件,但它能做到的不仅如此。它也是一款完善的媒体框架,您可将其用于转码所有类型的数据,甚至是流媒体。它最不为人所熟悉的功能之一就是能够录制用户的屏幕。VLC 屏幕录制功能的一种缺点是,您无法同时录制屏幕和音频。这是在这篇文章中将使用 AIR 2 的另一项新功能修复的内容录制麦克风输入的能力。准备将应用程序作为本机应用程序为在应用程序中使用全新的 NativeProcess 类,您需要在应用程序描述符文件中添加一行代码:extendedDesktop 您将在 Screenrecording_VideoOnly-app.xml 和 Screenrecording_VideoSound-app.xml 中找到这行代码。这将告诉编译器,您创建的不是普通的 AIR 文件,而是本机应用程序,此类应用程序具有扩展的特权,如访问外部应用程序等。屏幕录制代码位于 de.benz.exec.ScreenRecorder 类中。要使用此类,应将其传递给希望用作 File 对象的命令行应用程序。在实际应用程序中,您需要处理不同平台上的不同文件路径。例如,在 Mac OS X 上,VLC 程序的默认路径为 /Applications/VLC.app/Contents/MacOS/VLC,在 Windows 中,此路径通常为 C:Program FilesVideoLANVLCvlc.exe。一种解决方案是将外部应用程序与本机安装程序打包,随后使用 File 类的常量来独立访问用户平台的二进制程序。另外一种解决方案是允许用户在初次启动应用程序时选择路径。出于简单性的目的,本例中的路径采用了硬编码的方式,根据您的系统的不同,可能需要作出相应的调整。要在 AIR 中创建本机流程,您需要实例化一个 NativeProcessStartupInfo 对象,该对象将存储实际启动进程所需的全部必要信息,例如:var startupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); startupInfo.executable = vlcFile; 在实例化 NativeProcessStartupInfo 对象之后,将其传递给指向 VLC 可执行文件的 File 对象。设置命令行参数现在,您需要提供命令行参数。NativeProcessStartupInfo 对象有一个属性参数,这是带有所有必要参数的一个向量。VLC 完全可通过命令行控制。但大多数时候,您都是通过其提供的界面使用 VLC,因此确定要使用哪些参数可能有些困难。经过一些研究,我得出了以下这样的组合:-I rc -rc-fake-tty screen:/ :screen-fps=15 :screen-caching=100 :sout=#transcodevenc=x264bframes=0,nocabac,ref=1,nf,level=13,crf=24,partitions=none,vcodec=h264,fps=15,vb=3000, width=1024,height=740,acodec=none:duplicatedst=stdmux=mp4,access=file, dst=Set target file path here 要测试这些参数,可以直接在命令行中进行尝试。将此命令打包在 Vector 对象中后,应如下所示:var processArgs:Vector. = new Vector.(); processArgs.push(-I); processArgs.push(rc); processArgs.push(-rc-fake-tty); processArgs.push(screen:/); processArgs.push(:screen-fps=15); processArgs.push(:screen-caching=100); processArgs.push(:sout=#transcodevenc=x264bframes=0,nocabac,ref=1,nf,level=13,crf=24,partitions=none,vcodec=h264,fps=15,vb=3000,width=1024,height=740,acodec=none:duplicatedst=stdmux=mp4,access=file,dst=+targetFile.nativePath+); startupInfo.arguments = processArgs; 关键参数为: -I rc告诉 VLC 不应使用标准 VLC 界面启动,而是将其作为不可见的进程。rc 表示远程控制,允许与运行中的进程交互。 -rc-fake-tty告诉 VLC 应通过标准输入(STDIN)和标准输出(STDOUT)进行控制。 screen:/告诉 VLC 您希望使用计算机屏幕作为输入信号。 :screen-fps=15设置 VLC 尝试捕捉屏幕的帧率。应谨慎选择此项,因为它将给性能造成显著影响。屏幕录制是一项处理器密集的操作。如果帧率过高,就可能会导致系统响应缓慢。在我的系统中,将帧率设置为 15 最为理想,应已足够处理大多数屏幕录制任务。 :sout此参数用于为屏幕录制的编码设置所有参数,包括编码解码器选择、帧率、位速率和最终视频的尺寸。您可以采用多种类型的组合设置这些选项。对于本例而言,仅仅需要确保可编码为 Flash Player 支持的视频文件。所提供的示例会使用 H.264 执行屏幕录制编码。请注意,我将音频选项设置为 none(acodec=none),因为 VLC 不支持同时录制屏幕和音频。 :duplicate这个参数设置容器格式(本例中为 mp4)和所生成视频的目标。它还会告诉 VLC 生成一个物理文件(access=file)。至此已经完成了 NativeProcessStartupInfo 对象,接下来可以创建一个新的 NativeProcess 对象,为标准输出、错误和退出事件添加事件侦听器,从而创建实际进程:p = new NativeProcess(); p.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); p.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData); p.addEventListener(NativeProcessExitEvent.EXIT, onExit); 错误和输出事件处理器可跟踪控制台的结果。private function onOutputData(evt:ProgressEvent):void varoutputData:String=p.standardOutput.readUTFBytes(p.standardOutput.bytesAvailable); trace(outputData); private function onErrorData(evt:ProgressEvent):void varerrorData:String=p.standardError.readUTFBytes(p.standardError.bytesAvailable); trace(errorData); 要启动进程,请调用 NativeProcess 对象的 start() 方法,并将 NativeProcessStartupInfo 对象作为参数传递。p.start(startupInfo); 与正在运行的进程通信现在进程已经开始运行,VLC 已经开始录制屏幕。要停止录制,直接结束进程并不够,因为这将导致视频文件受损。您必须与正在运行的进程通信,在本例中是通过标准输入(STDIN)实现的。在 AIR 2 中,可以使用 NativeProcess 类的 standardInput 属性向正在运行的进程管道发送数据。standardInput 属性的类型为 IDataOutput,因此可以按照写入 ByteArray 的方法写入该属性。在 ScreenRecorder.as 中,stopRecording() 用于停止录制进程:publicfunctionstopRecording():void p.standardInput.writeUTFBytes(stop + n); setTimeout(kill,4000); 此方法写入一条停止命令,后接换行符。换行符与直接在终端窗口中按下回车键的效果相同,实际上也就是发出命令。通过这条命令,VLC 将被触发,以便正确关闭录制视频的文件流。在此之后,即可安全退出 VLC。然而,由于写入实际文件所需的时间略长,代码将通过超时的方式推迟此任务,使 VLC 能首先完成文件写入和关闭。要退出进程,kill() 方法将发出如下一条退出命令:private function kill():void p.standardInput.writeUTFBytes(quit + n); isRecording = false; dispatchEvent(new Event(Event.COMPLETE); 由于视频已经创建,因而将载入 Screenrecording_VideoOnly.mxml 的 WindowedApplication 中 onComplete 处理程序中的 VideoDisplay 对象内。private function onComplete(evt:Event):void vPlayer.source = screenRecorder.targetFile.url; 这就是第一部分。现在,您已经拥有了一种可录制用户屏幕的工具。目前,文件仅包含视频数据而无音频数据。在下一部分中,您将使用 AIR 的本机麦克风录制功能,同时录制麦克风声音。使用 AIR 2 录制音频。在上一节中,您已经学习了如何使用 VLC 录制无声音的视频数据。幸运的是,AIR 2 引入了访问来自连接的麦克风的原始 PCM 声音数据的能力。在 AIR 2 之前,录制线路输入声音的唯一方法就是通过 NetConnection 将录制的字节发送到 Flash Media Server 实例,而对于大多数桌面应用程序来说,这并非最优方法。在 AIR 2 中,开发人员可直接通过 Microphone 类实例触发的全新的 SampleDataEvent.SAMPLE_DATA 事件来直接访问麦克风。首先,您可能希望使用户有机会选择要录制的连接设备。可通过为用户界面添加一个包含已连接麦克风列表的组合框来实现: 这只需要在主应用程序类中添加一行 MXML 代码。上述代码会添加一个组合框,其数据提供者设置为 ArrayCollection 包含麦克风类的静态属性名称。实际录制逻辑位于 de.benz.screenrecording.AudioRecorder 类中。AudioRecorder.as 中的 startRecording 方法接收两个参量作为参数。第一个是输入设备的选定索引,第二个是对要存储所录制的声音数据的文件的引用。要开始录制,首先必须配置麦克风,可通过调用 麦克风类的静态函数 getMicrophone() 来获得麦克风的一个实例。microphone = Microphone.getMicrophone(micIndex); microphone.setSilenceLevel(0); microphone.rate = 44; microphone.addEventListener(SampleDataEvent.SAMPLE_DATA, onMicData); 为确保始终为麦克风录音,即便在无声音时也保持录音,请将 silence level(静音级别)设置为 0。microphone.rate = 44; 这行代码设置声音采样率,确定每秒从输入信号中获取多少样本(本例中为 44100)。作为最后一步,您需要为 SampleDataEvent.SAMPLE_DATA 添加一个事件侦听器,调用 onMicData 函数。下一步是创建用于写入声音字节的流。文件流将以 APPEND 模式打开,使得录音时每次写入新字节时都将新字节附加到文件末尾处。出于相同的原因,您还需要确保在打开流之前删除目标文件,否则字节将附加到之前的录制会话中。if(targetFile.exists) targetFile.deleteFile(); outputStream = new FileStream(); outputStream.open(targetFile, FileMode.APPEND); soundBytes = new ByteArray(); 声音字节的实际写入是在 onMicData 方法中完成的,在录制过程中,SampleDataEvent.SAMPLE_DATA 事件会反复调用此方法。该事件具有一个数据属性,即包含所录制声音样本的 ByteArray。每个声音样本都是一个 32 位的浮点数,包含 -1 到 1 之间的正规化数值,可通过 readFloat() 方法从字节数组中读取。protected function onMicData(sampleData:SampleDataEvent):void while(sampleData.data.bytesAvailable) sample = sampleData.data.readFloat(); outputStream.writeShort(sample*32767); / normalize for bitrate 16 要在稍后处理这些字节,需要将值转换为 16 位有符号整型值,使之可包含 -32768 至 +32767 范围的值。要执行转换,只需将浮点值乘以 32767 即可。随后,样本将使用 writeShort() 写入文件流。要停止录制,请删除 SampleDataEvent.SAMPLE_DATA 时间侦听器,并关闭文件流。public function stopRecording():void microphone.removeEventListener(SampleDataEvent.SAMPLE_DATA, onMicData); outputStream.close(); 如果运行此应用程序,它将产生两个文件:无声音的 H.264 视频文件和包含原始声音字节的文件。在下一节也是最后一节中,您将使用 FFmpeg 整合者两个文件,并生成一个包含视频和音频轨道的文件。通过 FFmpeg 合并音频和视频FFmpeg 是一种跨平台的应用程序,用于操纵广泛的媒体文件。它完全可通过命令行控制,以了解当今最流行的音频和视频编码解码器和文件格式。其命令行访问和跨平台特征使之成为在 AIR 应用程序中使用的完美选择。在这一节中,您将看到如何使用 FFmpeg 作为外部进程,合并视频轨道和原始音频字节。VideoSoundMerger 类的一般设置与 ScreenRecorder 类极为相似,它也处理本机进程的运行。传递给 NativeProcessStartupInfo 对象的进程参数不同。此外,无需与正在运行的进程交互,因为它仅仅处理命令,并在完成后自动关闭。以下是用于通过 FFmpeg 合并声音和视频轨道的一些命令行参数:-isync -f s16be -i -i -acodec libfaac -ab 128 -vcodec copy -isync告诉 FFmpeg 将视频与音频轨道同步。 -f s16be告诉 FFmpeg 声音轨道的样本编码为 big endian 的 16

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论