如何将视频录制到AIR中的本地磁盘?

时间:2010-01-21 21:31:55

标签: air video-capture

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

我见过的事情:

  • FileStream - 允许read.writing本地文件,但没有.attachCamera和.attachAudio方法用于创建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不支持录制到磁盘,是否有其他选择将音频和视频捕获到用户本地硬盘上的文件?

提前致谢!

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

无法使用某些流媒体服务(如Windows Media编码器,Red5或Adobe的媒体服务器或其他内容)直接将视频流式传输到本地磁盘。

我已尝试过互联网上的所有样本,但迄今为止没有解决方案。

请查看此链接以了解其他可能性:

http://www.zeropointnine.com/blog/updated-flv-encoder-alchem/

答案 2 :(得分:0)

我也在尝试做同样的事情,但我从avchat.net的开发者那里得知,目前还不可能用AIR做到这一点。如果你确实知道该怎么做,我很想知道!

我也找到了这个链接,不确定它有多大帮助http://www.zeropointnine.com/blog/webcam-dvr-for-apollo/

答案 3 :(得分:0)

好吧,我只是认为让它连接到任何东西(NULL)都行不通。我已经让他尝试连接到localhost,但这也没有用。我认为这甚至不可能。流式视频仅适用于Flash Media Server和Red5,不适用于本地。也许你可以在你的PC上安装Red5?

答案 4 :(得分:0)

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

在第9点零点的绅士,提出了一个新版本和你在正确的道路上。看看the new flv recorder。我花了很多时间来处理这个问题,但从来没有让它满足我的需求(两个摄像头)。我根本无法得到我需要的FPS。但它可能对你有用。它比原始方法快得多。

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