2010-01-21 69 views
8

我试图将网络摄像头的视频和音频录制到存储在用户本地硬盘上的FLV文件中。我有一个使用NetConnection和NetStream通过网络将视频流式传输到FMS(Red5)服务器的代码版本,但我希望能够在本地存储视频以适应低带宽/片状网络情况。我正在使用FLex 3.2和AIR 1.5,所以我不认为应该有任何防止这种情况发生的沙箱限制。如何将视频录制到AIR中的本地磁盘?

事情我已经看到:

  • FileStream - 允许reading.writing本地文件,但没有.attachCamera和.attachAudio methids创建FLV。
  • flvrecorder - 从网络摄像头产生屏幕抓图并创建它自己的flv文件。不支持音频。许可证禁止商业使用。
  • SimpleFLVWriter.as - 与没有奇怪许可证的flvrecorder类似。不支持音频。
  • This stackoverflow post - 演示使用NetConnection/NetStream从本地磁盘播放视频。

鉴于我已经有一个使用NetStream流式传输到服务器的版本,我认为最后一个版本是最有前途的,并继续完成这个演示应用程序。代码编译和运行没有错误,但我没有在单击停止按钮的磁盘上的FLV文件。 -

<mx:Script> 
    <![CDATA[ 

     private var _diskStream:NetStream; 
     private var _diskConn:NetConnection; 
     private var _camera:Camera; 
     private var _mic:Microphone; 

     public function cmdStart_Click():void { 
      _camera = Camera.getCamera(); 
      _camera.setQuality(144000, 85); 
      _camera.setMode(320, 240, 15); 
      _camera.setKeyFrameInterval(60); 

      _mic = Microphone.getMicrophone(); 

      videoDisplay.attachCamera(_camera); 

      _diskConn = new NetConnection(); 
      _diskConn.connect(null); 

      _diskStream = new NetStream(_diskConn); 
      _diskStream.client = this; 
      _diskStream.attachCamera(_camera); 
      _diskStream.attachAudio(_mic); 
      _diskStream.publish("file://c:/test.flv", "record"); 

     } 

     public function cmdStop_Click() { 
      _diskStream.close(); 
      videoDisplay.close(); 
     } 

    ]]> 
</mx:Script>  
    <mx:VideoDisplay x="10" y="10" width="320" height="240" id="videoDisplay" /> 
    <mx:Button x="10" y="258" label="Start" click="cmdStart_Click()" id="cmdStart"/> 
    <mx:Button x="73" y="258" label="Stop" id="cmdStop" click="cmdStop_Click()"/> 

</mx:WindowedApplication> 

在我看来,有要么有毛病这是防止它的工作,或NetStream只是不能在此温妮被滥用来记录视频上面的代码。

我想知道的是,a)上面的代码有什么(如果有的话)是错误的? b)如果NetStream不支持录制到磁盘,有没有其他方法可以将音频和视频捕获到用户本地硬盘上的文件?

在此先感谢!

+0

为什么不使用AIR 2.0吗?可能会更容易使用AIR 2.0功能进行麦克风录制...使用AIR 2.0的顺便说一句,您至少可以压缩视频(不使用炼金术)......或者您至少可以测试您的流是可玩的只是试图播放它 - 不写入文件系统 – Rella 2010-01-25 23:49:44

+0

在问AIR 2.0时仍处于测试阶段。我研究了它,并且它似乎没有为Camera或FileStrewam对象提供额外的API,但是,如果AIR 2.0允许本地录制相机,我一定会使用它。 – 2010-03-14 10:52:05

回答

0

我也在尝试做同样的事情,但是我从avchat.net的开发者那里得知,目前无法使用AIR来做到这一点。如果你确实知道如何去做,我很想知道!

我也发现了这个链接,它是不知道如何有帮助http://www.zeropointnine.com/blog/webcam-dvr-for-apollo/

+0

嗨,Webcam DVR后面的视频录制后端是我喜欢的SimpleFLVRecorder.as。 SimpleFLVWriter.as的主要问题是,它不支持与网络摄像头视频一起录制音频。在我的应用程序中,音频非常重要(实际上,这是一种仅记录音频的解决方案,没有视频会比没有音频的视频更好)。 – 2010-03-14 10:58:35

0

好吧,我只是觉得,让它连接到无(NULL)不起作用。我已经让他尝试连接到本地主机,但这也没有成功。我不认为这是可能的。流式视频仅适用于Flash Media Server和Red5,不适用于本地。也许你可以在你的PC上安装Red5?

+0

目标是提供用户从网站下载的“应用程序”(理想情况下按照AIR允许的那样无缝安装),以便用户录制视频并将其上传到Red5服务器。在本地机器上安装Red5意味着我们需要创建一个单独的安装程序App,它为用户安装了我们的应用程序和Red5。不是我们希望的无缝钢管经验。 – 2010-04-29 22:01:58

0

可悲的是,摄像头在闪存中的视频支持是很差差。当您流式传输原始数据时,问题在于您必须对FLV进行编码,并且实时执行该操作需要非常快速的计算机。第一代概念将原始位图写入文件(或序列化数组),然后第二种方法将文件转换为FLV。基本上你必须轮询相机并将每个帧保存为位图,然后堆叠在一个数组中。这是非常有限的,不能做音频。它也很难达到5-10fps以上。

在零点九的绅士,提出了一个新的版本,你在正确的道路上。看看the new flv recorder。我花了很多时间处理这件事,但从未完全满足我的需求(两台相机)。我无法得到我需要的FPS。但它可能适合你。它比原来的方法快得多。

我知道的唯一的其他工作选项是让Red5保存视频并将其下载回应用。

2

我的解决方案是将Red5嵌入到AIR中。 与您分享我的文章

http://mydevrecords.blogspot.com/2012/01/local-recording-in-adobe-air-using-red5.html

一般情况下,解决方案是嵌入免费的媒体服务器的Red5成为AIR类似的资产。所以,服务器将出现在AIR应用程序文件夹中。然后,通过NativeProcess,您可以运行Red5并将其实例存储在内存中。因此,您可以在没有任何网络问题的情况下进行本地视频录制。

+0

欢迎来到Stack Overflow!虽然这可能会在理论上回答这个问题,[这将是更可取的](http://meta.stackexchange.com/q/8259)在这里包括答案的基本部分,并提供参考链接。 – 2012-01-12 17:52:41

+0

嗨,彼得。谢谢。 问题是,仅仅在评论的正文中描述解决方案有点困难。 通常,解决方案是将免费的媒体服务器Red5嵌入到AIR中,就像资产一样。所以,服务器将出现在AIR应用程序文件夹中。通过NativeProcess,您可以运行Red5并将其实例存储在内存中。因此,您可以在没有任何网络问题的情况下进行本地视频录制。 – walv 2012-01-16 09:22:05

+0

谢谢。我已将您的评论置入您的答案中。 – 2012-01-16 13:50:49

相关问题