Запись аудио на сайте: поток Red5 или размещение аудиоданных? - PullRequest
0 голосов
/ 07 сентября 2011

Позвольте мне сначала установить, что я хочу сделать:

Мой пользователь может записывать голосовые заметки на моем веб-сайте, добавлять теги к указанным заметкам для индексации, а также заголовок.Когда заметка сохраняется, я сохраняю путь заметки вместе с другой информацией в моей БД.

Теперь у меня есть 2 варианта сделать запись, обе включают в себя .swf, встроенный в мой сайт:

1) Я мог бы использовать сервер Red5 для потоковой передачи аудио на мой сервер и сохранить файл и вернуть путь к указанному файлу в мое приложение для сохранения БД, это довольно сложно, так как мне пришлось бы конвертировать аудио ипереместите его в соответствующую папку, принадлежащую пользователю, в приложении Red5 на стороне сервера, которое я не очень знаю, как создать.

2) Я мог бы просто записать звук и захватить его байтовый массив,выполните для него кодировку Base64 и отправьте ее в PHP вместе с остальными необходимыми данными (будь то простой вызов POST или AJAX), декодируйте его на сервере и создайте файл с соответствующим расширением, преобразование звукаЭто также может произойти при использовании ffmpeg, эта опция кажется более простой, но я не знаю, насколько она жизнеспособна.

Какой вариант, по вашему мнению, является более жизнеспособным и легчеразвиваться?Заранее спасибо

1 Ответ

4 голосов
/ 07 сентября 2011

В зависимости от запланированной продолжительности записи, вы вполне можете использовать опцию номер два. Недавно я успешно применил подобный подход для проекта, но записи заняли не более 30 секунд. Вот что я сделал не так, как вы предлагаете, и почему я думаю, что лучше:

  • Чтобы захватить звук с микрофона и сохранить его в ByteArray, используйте событие SAMPLE_DATA , которое отправляется всякий раз, когда из микрофона поступает больше звуковых данных. В документации есть пример, который должен объяснить это достаточно хорошо.

  • Поскольку большинство пользователей используют обычные домашние компьютеры без какого-либо специального записывающего оборудования, можно было с уверенностью предположить, что полная точность записи не требуется. Я использовал только 2 байта на семпл и только моно, вместо того, чтобы использовать полные 64-битные числа с плавающей запятой (AS3 Number), которые вы получаете от микрофона на событии SAMPLE_DATA. Просто прочитайте Number и выполните myFloatSample * 0x7fff для преобразования в 16-разрядное целое число со знаком.

  • Не используйте собственную частоту дискретизации 44,1 кГц, если вы просто записываете речь или что-то еще в этом частотном диапазоне. С 22,05 кГц вы, скорее всего, сойдете с ума, что сразу сократит объем данных вдвое. Просто установите свойство Microphone.rate соответственно.

  • Не используйте Base64 для кодирования ваших данных. Отправьте его как двоичные данные, которые будут значительно меньше. Вы можете отправить его как необработанные данные POST или используя что-то вроде AMF. Кроме того, перед отправкой используйте встроенные методы compress() или deflate() в ByteArray, чтобы сжать его. На сервере распакуйте, используя алгоритмы ZLIB или raw DEFLATE (inflate) соответственно, которые PHP поддерживает .

  • После распаковки на сервере у вас есть, по сути, то, что называется необработанным 16-битным моно-потоком PCM. Кстати, это должен быть один из тех форматов ввода, которые поддерживает ffmpeg (или lame), поэтому вы должны иметь возможность кодировать его в mp3 без необходимости какого-либо ручного декодирования.

Очевидно, что решение Red5, вероятно, будет лучше, потому что оно более приспособлено для этой задачи. Но если у вас нет ресурсов для настройки сервера Red5 или вы не хотите использовать Java, доказано, что вышеупомянутое решение работает хорошо, пока вы избегаете слишком длинных записей.

Чтобы взять простой пример, 30-секундная запись со скоростью 22 050 выборок в секунду, 2 байта на выборку, будет ~ 1,3 МБ. Даже после дефляции передача на сервер, скорее всего, будет длиться почти мегабайт в течение 30 секунд аудио. Это может или не может быть приемлемым для вашего приложения.

...