Как записать видео на локальный диск в AIR? - PullRequest
8 голосов
/ 22 января 2010

Я пытаюсь записать видео и аудио с веб-камеры в файл 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 не поддерживает запись на диск, есть ли другие альтернативы, которые записывают аудио и видео в файл на локальном жестком диске пользователя?

Заранее спасибо!

Ответы [ 5 ]

2 голосов
/ 17 января 2012

Невозможно осуществлять потоковую передачу видео непосредственно на локальный диск без использования какого-либо потокового сервиса, такого как кодировщик Windows Media, Red5, медиа-сервер Adobe или что-то еще.

Я попробовал все образцы в интернете, но пока не нашел решения.

посмотрите на эту ссылку для другой возможности:

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

2 голосов
/ 12 января 2012

Моим решением было встроить Red5 в AIR. Поделиться с вами моей статьей

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

В общем, решение состоит в том, чтобы встроить бесплатный медиасервер Red5 в AIR как актив. Итак, сервер будет присутствовать в папке приложения AIR. Затем через NativeProcess вы можете запустить Red5 и сохранить его экземпляр в памяти. В результате вы можете вести локальную видеозапись без проблем с сетью.

0 голосов
/ 25 апреля 2010

Ну, я просто думаю, что позволить подключиться ни к чему (NULL) не работает Я уже позволил ему попытаться подключиться к localhost, но это тоже не сработало. Я не думаю, что это даже возможно. Потоковое видео работает только с Flash Media Server и Red5, а не локально. Может быть, вы могли бы установить Red5 на вашем компьютере?

0 голосов
/ 01 ноября 2011

К сожалению, поддержка видео во вспышке с камер очень плохая. Когда вы транслируете его в сыром виде, проблема заключается в том, что вам нужно кодировать в FLV, а выполнение в реальном времени требует очень быстрого компьютера. Концепции первого поколения записывают необработанные растровые изображения в файл (или сериализуют массив), затем второй метод преобразует файл в FLV. В основном вы должны опрашивать камеру и сохранять каждый кадр как растровое изображение, а затем складывать в массив. Это очень ограничено и не может делать аудио. Было также очень трудно подняться выше 5-10 кадров в секунду.

Джентльмен в нулевой точке девять, придумал новую версию и вы на правильном пути. Посмотрите на новый рекордер flv . Я потратил много времени на работу с этим, но так и не смог заставить его работать для моих нужд (две камеры). Я просто не мог получить нужный мне FPS. Но это может сработать для вас. Это было намного быстрее, чем оригинальный метод.

Единственная известная мне другая рабочая опция - Red5 сохраняет видео и загружает его обратно в приложение.

0 голосов
/ 12 марта 2010

Я тоже пытаюсь сделать то же самое, но мне сказали от разработчиков avchat.net, что в настоящее время это невозможно сделать с AIR. Если вы узнаете, как это сделать, я хотел бы знать!

Я также нашел эту ссылку, не уверен, насколько она полезна http://www.zeropointnine.com/blog/webcam-dvr-for-apollo/

...