Я пытаюсь записать видео и аудио с веб-камеры в файл FLV, хранящийся на локальном жестком диске пользователя. У меня работает версия этого кода, которая использует NetConnection и NetStream для потоковой передачи видео по сети на сервер FMS (Red5), но я хотел бы иметь возможность хранить видео локально для ситуаций с низкой пропускной способностью / нестабильной сетью. Я использую FLex 3.2 и AIR 1.5, поэтому я не верю, что должны быть какие-либо ограничения в песочнице, чтобы это не происходило.
Вещи, которые я видел:
- FileStream - позволяет читать и записывать локальные файлы, но без метаданных .attachCamera и .attachAudio для создания FLV.
- flvrecorder - Производит снимки экрана с веб-камеры и создает свой собственный файл flv. Не поддерживает аудио. Лицензия запрещает коммерческое использование.
- SimpleFLVWriter.as - Похоже на flvrecorder без лицензии wierd. Не поддерживает аудио.
- Это сообщение о переполнении стека - демонстрирует воспроизведение видео с локального диска с использованием 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 просто нельзя злоупотреблять таким способом записи видео.
Что я хотел бы знать, это: а) Что (если что-то) не так с кодом выше? б) Если NetStream не поддерживает запись на диск, есть ли другие альтернативы, которые записывают аудио и видео в файл на локальном жестком диске пользователя?
Заранее спасибо!