8

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

我见过的东西:

  • FileStream - 允许读取、写入本地文件,但不允许使用 .attachCamera 和 .attachAudio 方法来创建 FLV。
  • flvrecorder - 从网络摄像头生成屏幕抓取并创建它自己的 flv 文件。不支持音频。许可禁止商业用途。
  • SimpleFLVWriter.as - 类似于没有奇怪许可证的 flvrecorder。不支持音频。
  • 这篇 stackoverflow 帖子- 演示了使用 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 不支持录制到磁盘,是否还有其他替代方法可以将音频和视频捕获到用户本地硬盘上的文件中?

提前致谢!

4

5 回答 5

2

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

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

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

于 2012-01-12T17:47:45.957 回答
2

如果不使用 Windows Media 编码器、Red5 或 Adob​​e 的媒体服务器等流媒体服务,则无法将视频直接流式传输到本地磁盘。

我已经尝试了互联网上的所有示例,但迄今为止没有解决方案。

查看此链接以获取另一种可能性:

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

于 2012-01-17T05:26:07.863 回答
0

我也在尝试做同样的事情,但我从 avchat.net 的开发人员那里得知,目前无法使用 AIR 来执行此操作。如果你知道怎么做,我很想知道!

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

于 2010-03-12T17:33:48.397 回答
0

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

于 2010-04-25T17:27:29.700 回答
0

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

九点零时的绅士想出了一个新版本,你走上了正确的道路。看看新的 flv 刻录机。我花了很多时间来处理这个问题,但从来没有完全满足我的需求(两台相机)。我只是无法获得所需的 FPS。但它可能对你有用。它比原始方法快得多。

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

于 2011-11-01T18:55:54.800 回答