我正在尝试将网络摄像头的视频和音频录制到存储在用户本地硬盘上的 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 不支持录制到磁盘,是否还有其他替代方法可以将音频和视频捕获到用户本地硬盘上的文件中?
提前致谢!