Показаны сообщения с ярлыком Microphone. Показать все сообщения
Показаны сообщения с ярлыком Microphone. Показать все сообщения

воскресенье, апреля 05, 2009

Записываем звук с помощью Red5

Этот пост - итог исследования "Сохраняем звук с микрофона на сервер" проведенного еще в январе. Суть проекта - конкурс колыбельных - любой желающий может зарегистрироваться и записать песню в собственном исполнении.

Как обычно бывает, с момента зарождения проекта, уходят месяцы на процесс впаривания, продажи, рисования и утверждения дизайна. И вот, наступает очередь разработчиков, и, как обычно, на flash выделяется неделя, в лучшем случае - две (какая несправедливость).
В этот раз, правда, всё было несколько иначе - разработка началась как раз примерно за неделю до моего отлета в Египет. Поэтому, пришлось сделать максимум, чтобы без меня две недели люди всё это ставили на свои рельсы. Принцип вынесения всех настроек в FlashVars решает эту проблему на раз. Главное не забыть составить подробный мануал.

Итак, мы пришли к решению, что лучше в качестве медиа-сервера использовать Red5. Процесс установки под Windows и тестирования Red5 для локальной разработки я описал здесь: Установка Red5 и всё что нужно для Red5-разработки. По сути, в этом посте изложено всё необходимое для создания минимального приложения для записи звука/видео. В качестве формата хранения звуковых данных, решили оставить FLV. Сначала планировали конвертацию FLV в MP3 на сервере, и даже были идеи как это реализовать. Но позже решили, что для нужд проекта это излишество и лишняя нагрузка на сервер. Все записи сохраняются как есть, в формате FLV, и воспроизводятся проигрывателем, который, кстати, по виду и функционалу совсем не отличается от того, что воспроизводит MP3.

С flash-частью оказалось всё слишком просто. Достаточно было использовать версию Flash 8 и AS2. За основу я взял пример из ...\Red5\swf\samples\SimpleRecorder.fla. С момента окончания разработки прошло уже около месяц и многое забылось, но вот пара важных заметок:
  • Для записи, уровень тишины необходимо ставить в 0 (setSilenceLevel). Если для голосового общения, функция активности микрофона важна для экономии трафика, то при записи речи или песни это может навредить - запись будет не идентична выступлению.
  • Необходимо ограничить время записи (например, по таймауту), иначе найдутся охотники заполнить дисковое пространство сервера бесполезным мусором. Хотя, конечно, правильнее это ограничение сделать на сервере.

В итоге, на выходе у меня получились две версии проигрывателей звука в форматах MP3 и FLV (можно было сделать универсальный, но времени не хватило) и рекордер звука.
На локальном Red5, под Windows, это хозяйство работало на ура. Однако, когда потребовалось поставить Red5 под FreeBSD (если не ошибаюсь), у админов возникли серьезные проблемы с настройкой нашего приложения. Подробности мне не известны, знаю только, что у них всё заработало за день до моего прилета (т.е. возились 2 недели :) ).
Такова уж особенность Open Source - конфигурация представляет собой темный лес xml-файлов, а нормальные инструменты по настройке, так чтобы галочку поставил и всё заработало - отсутствуют. Вот и выбирайте - платить за софт, или платить специалистам за настройку бесплатного софта. Но, слава Богу, всё это уже не моя забота.

* * *

Неплохая статья в тему:
Урок. Вебкамеры с Flex 3. Часть 2

понедельник, января 19, 2009

Сохраняем звук с микрофона на сервер

Сегодня на повестке дня стоит вопрос - как записать звук и сохранить его на сервер при помощи Flash. Задача с первого взгляда простая, попробуем-ка с ней разобраться.
Не забываем, что снять звук напрямую в Flash Player нельзя: Flash-разработка: Прокол с микрофоном.

Для начала, поглядим, что скажет наши самые близкие помощники - Adobe Flex 3 Help и Adobe® Flex™ 3 Language Reference:

Главная статья о работе со звуком. Тут мы проваливаемся в Capturing sound input и смотрим, как получить звук с микрофона и что, собственно, можно сделать с этим звуком.

Итак, Microphone - класс, который нам позволит записать звук с нашего микрофона.
При использовании микрофона, необходимо, чтобы размер окна нашего приложения был не менее 215 x 138. Иначе ничего не выйдет - Flash Player должен вывести из соображений безопасности окно подтверждения использования микрофона (а как бы здорово было бы скрыть это окошко и подслушивать, что там говорят юзеры про наш сайт :). Кстати, умные люди додумались, как это сделать). Класс позволяет выбрать и активировать при помощи метода getMicrophone нужный микрофон, настроить характеристики записи.

  • Accessing a microphone - читаем и копипастим, как активировать микрофон.
  • Routing microphone audio to local speakers - возможность транслировать звук на колонки юзера. Это наверное для того, чтобы лучше себя слышать в наушниках или сделать эдакий "громкоговоритель" :). Скорее всего, эта функция нужна для того, чтобы юзер мог убедиться собственными ушами, что его микрофон работает.
  • Altering microphone audio - вкратце о том, как поменять громкость и частоту.
  • Detecting microphone activity - рассказывает о таком полезном свойстве, как отключение приема звука через интервал времени silenceTimeout, если его уровень activityLevel менее silenceLevel. Это экономит производительность и трафик, в общем - очень правильный подход. При отключении микрофона после тайм-аута и его включении при появлении звука, генерируется событие ActivityEvent.ACTIVITY, что и помогает нам включать и выключать запись звука. Нужно также учесть, что микрофон включается не сразу, а после некоторой задержки - это плата за экономию трафика - если установить порог тишины, то микрофон отключаться не будет, но зато и задержка исчезнет.
  • Sending audio to and from a media server - то что нам и нужно. Говорят, что нет ничего проще - приаттачить объект нашего микрофона к NetStream и передавать данные прямо на сервер типа Flash Media Server.

Вот, собственно и вся теория. Переходим к практике. Для начала, пошуршим по Гуглу на предмет нашего вопроса.

Как я понимаю, нас интересуют серверы, которые обеспечивают потоковую передачу данных по средством протокола RTMP или Real Time Messaging Protocol.

Вот информация о медиа-серверах:

Итак, рассмотрем претендентов на использование в качестве сервера:

Flash Media Server:
Семейство продуктов Flash Media Server - лидирующее решение для задач обработки потокового видео, рилтайм-коммуникаций. В общем, как всегда у Adobe всё безупречно и дорого. Лучше смотреть таблицу сравнения редакций сервера. Для нашей задачи, вполне достаточно версии Flash Media Streaming Server, ценой в пределах $1k (если не ошибаюсь, платить надо каждый год).
Есть и такие мнения: Не так уж и хорош Flash Media Server. Передача данных с FMS на веб-сервер.
Опыта разработки крупномасштабных on-line систем у меня нет, поэтому делаю пока основанный только на воспринятой информации, чисто субъективный вывод - использовать FMS для записи звука - качественная стрельба по воробьям из ракетного комплекса.

Wowza: Относительно свежий, годичной давности, сервер. Не бесплатный, но все же на много дешевле (Wowza Media Server Pro...имеет более гуманную лицензионную модель) чем FMS медиа-сервер. Русскоязычной информации по серверу не так много, а документации, предоставленной на сайте, вполне достаточно.
Полезная информация: RTMP транспорт для Flashphone.ru теперь обеспечивается Wowza Media Server.

RED5: Самый популярный опенсорсный медиа-сервис. Информации про него - море, хотя на сайтах проекта черт ногу сломит. Есть довольно кривая документация в PDF.
Начать можно, хотя бы вот - со статьи "Начало разработки с Red5". Вот еще статейка, которая поможет нам начать: Изучаю Red5 с нуля =). Тут же имеется ссылка на доки.
Полезная информация: Red5 на Википедии, RED5 на ohloh, Red5 Plugin для Eclipse IDE - beta 1, red5-recorder.

Кстати, любопытный факт. SmartFox Server так же позволяет работать с потоковыми видео и аудио. Отвечает за это дело, некий модуль, именуемый RedBOX, который базируется, как вы уже догадались, на Red5 project. Модуль этот, само собой, бесплатный, так что, при желании, можно организовать видео-аудио общение игроков в процессе онлайн-игры. И с документацией тоже всё в порядке. Что тут говорить - молодцы, здорово подсуетились.

haXeVideo: Многопоточный сервер, осуществляющий управление FLV-видеопотоками. Это совсем свежий, конечно же бесплатный, сервер, полностью написанный на haXe, легкий, не требовательный к производительности сервера, и очень масштабируемый. Вот Официальный релиз haxeVideo 1.0. Собственно, никаких видимых сложностей для использования сервера нет - это можно наблюдать в небольшом туторе Пробуем haxeVideo. Как видно из примера, серверная часть не потребовала ни сложного конфигурирования, ни программирования. Однако, мы наблюдали появление FLV-видео, а вот как насчет, к примеру MP3? Поиски привели к какой-то почтовой переписке, но я так с ней и не разобрался. Вообще, информации пока мало, но это не значит, что сервер haXeVideo не является достойным решением.

Mammoth - The Open Source Flash Streaming Server.
Собственно релиз от Роста Встречайте Open Source Flash Media Server — Mammoth раскрывает основные моменты. Кроме того, жаркая дискуссия в этом посте может здорово помочь в выборе медиа-серверов и раскрыть их сильные и слабые стороны.

А вот к примеру, интересно посмотреть, как реализуется простой PHP-streaming.
Есть способ с исходниками, 'Streaming' flv video via PHP, take two. Правда он работает не на запись видео а на воспроизведение. Совсем старый... Но посмотрите, внизу есть пара апдейтов конца 2007-го. Попробуем качнуть. Действительно, здесь довольно замысловатый, но аккуратный PHP код и два fla (под FP7 и FP8) с проигрывателями всего этого безобразия.

Kaltura. Это целая опенсорсная видео-платформа (как нам рассказывает OSFlash). Она позволяет интегрировать в любой сайт множество интерактивных медийных наворотов с полной поддержкой онлайн-видео. Говорят, можно легко инсталлировать модули на такие веб-платформы как MediaWiki, WordPress, Drupal, Joomla и тд. И на ней сидят такие сайты как MySpace, YouTube, Flickr, ccMixter, Jamendo, и даже The New York Public Library.
Сайт тоже очень качественный, что даже странно для опенсорсной платформы.
Kaltura посвящен раздел Википедии на русском.
KalturaServer отвечает за управление контентом и правами, хранени, доставку, обработку, видео- и аудио- кодирование и прочее.
Клиентская часть (Flex), KalturaCVF, Kaltura Collaborative Video Framework, представляется тремя уровнями:

  • Core - ядро (управление видео, событиями, метаданными и т.д.).
  • KalturaPresentationLayer - уровень визуализации (набор библиотек управления стилями, скинами, связыванием данных и т.п.).
  • KalturaWidgets - богатый набор Flex-приложений, который, действительно впечатляет.

Интересно, на сколько всё это понятно и бесплатно. Короче, надо смотреть, тут море информации. В русскоязычном интернете я кроме новостей и анонсов ничего толком не нашел. Может быть не там искал?

На этом пока обзор закончу, но по мере появления информации, буду делать апдейты. Выводы делать еще рано, но в любом случае, какое-то решение будет принято.

* * *

Понемножку просматриваю ресурсы по медиа-серверам. Читая про Red5, выяснил, что писать звук с клиента в формате MP3 он не умеет, по причине того, что Flash player поддерживает только аудио-формат NellyMoser, а сервер всего лишь снимает входящий поток. Утилит под Linux для транскодирования NellyMoser по-видимому нет.
При таком раскладе, haxeVideo вполне равноценно Red5 в плане записи mp3.
Однако, часто упоминается некий проект ffmpeg, и как про него говорят, он поддерживает FLV. Кроме того, есть упоминание о разработке потокового сервера ffserver. И проекты, где использовался.

Еще информация по записи звука Red5: Flash Media Server and Red5 Resources.

* * *

Добрался до конвертации flv -> mp3. По этой теме есть следующие идеи: Converting audio FLV file to MP3?, где предлагается конвертировать NellyMoser в WAV, а затем уж в MP3, что не вызывает проблем. А решается это при помощи следующего инструмента: nellynomore. Работает ли это или нет - не могу сказать. Скоро узнаем.

* * *

Информация о установке RED5 на FreeBSD:
http://osflash.org/red5/suse (говорят, что вроде работает)
http://www.opennet.ru/openforum/vsluhforumID1/77112.html
http://portsmon.freebsd.org/portoverview.py?category=www&portname=red5

* * *

haxeVideo и FreeBSD:
http://haxe.ru/node/151#comments

* * *

rubyizumi
RTMP Server(MP4/H.264) for Flash video/audio streaming written in Ruby

четверг, июля 31, 2008

Прокол с микрофоном

Хотелось поиграться со спектром звука, снятого с микрофона. Сам класс Microphone ничего более-менее полезного не предоставляет. А SoundMixer на звуки от микрофона не реагирует.

Порыв интернет, нашел статейку "Sound Spectrum + Microphone = Disappointment", которая подтвердила мои опасения. Одно обнадеживает - 10й Flash будет поддерживать эту возможность.

А пока остается одно - сохранять запись на сервер, затем считывать и обрабатывать.
Как это сделать - разберемся позже.

* * *

И тут тоже подстерегает засада: в статье "SoundMixer.computeSpectrum + Microphone?" , в комментариях есть такая фраза: "Flash Media Server ... That's why the mic input and video input go into black boxes -- so you can't get the raw data from it and transmit or save the bytes. Otherwise there would be no need for Media Server. ... " Это значит, что нужен FMS или Red5. То есть задача усложняется на порядки. Эхх. Ждем Астру.

* * *

Кстати говоря, чтобы отправить звук с микрофона на сервер (лайвдоки) используется класс NetStream и метод public function attachAudio(microphone:Microphone):void.