Синхронизация двух AS3 NetStreams - PullRequest
2 голосов
/ 06 ноября 2010

Я пишу приложение, которое требует записи аудиопотока во время воспроизведения фоновой дорожки.У меня это работает, но между воспроизведением и началом записи существует непоследовательный разрыв.

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

Теперь я думаю, что, поскольку мое записанное аудио является только монофоническим, я могу включить некоторый «управляющий сигнал» навторая стерео-дорожка, которую я мог бы использовать, чтобы точно определить, когда начинается запись звука (или прикрепить всю фоновую дорожку в этом канале, чтобы я мог синхронизировать их таким образом).Это оставляет меня с новой проблемой правильного внедрения этого звука в NetStream.

Если у кого-то есть идея, будет ли работать любая из этих идей, как их реализовать или какие-то альтернативы, это было бы чрезвычайнополезно!Некоторое время работал над этой проблемой

Ответы [ 4 ]

0 голосов
/ 13 ноября 2010

кажется, что никакие события не отправляются при запуске соединенияпрослушиватель и обработка содержимого NET_STATUS.info

справочных документов as3 здесь , и вы ищете NET_STATUS.info

0 голосов
/ 09 ноября 2010

Если вы хотите внедрить что-то в NetStream ... Сложнее, чем SOUND ... Думаю, здесь было бы лучше использовать Socket . Вы будете непосредственно читать байты. Возможно, в NetStream имеется сжатие, поэтому отправляемые данные не являются необработанными звуковыми данными - там понадобится какой-то класс для распаковки кодека. Когда вы наконец получите необработанные звуковые данные, добавьте туда входные данные, используя Socket.readUnsignedByte () или Socket.readFloat () , и запишите измененные данные, используя Socket.writeByte () или Socket.writeFloat () .

Это альтернатива введению спины в звук.


Для синхронизации это на самом деле довольно просто. Даже если данные могут быть отправлены не сразу, одно остается неизменным - время. Итак, когда аудио пользователя закончено, просто смешайте его, не добавляя ничего к обратной дорожке - время должно остаться прежним.

ЕСЛИ у пользователя медленная ЗАГРУЗКА интернета, так что у его возврата есть нежелательные разрывы - проверьте в SWF, достаточно ли буферизованы данные для добавления следующего звукового буфера (обычно 4096 байт, если я правильно помню) , Если да, продолжайте потоковую передачу аудио пользователя.

Если нет, НЕ выполняйте потоковую передачу и запускайте, как только данные возвращаются.

0 голосов
/ 10 ноября 2010

По моему опыту, NetStream - одна из самых неточных и грязных функций Flash (NetStream: play2? !!), которая, между прочим, довольно иронична, видя, что основное использование Flash, вероятно, - воспроизведение видео.Попытка синхронизировать его с чем-либо другим надежным способом очень трудна ... события и статусы не очень просты, и есть много проблем, которые могут испортить вашу синхронизацию.

К счастью, netStream.time будетдостаточно точно сказать текущую позицию точки воспроизведения, так что вы можете в конечном итоге использовать ее для определения времени начала, задержек, пропущенных кадров и т. д. Обратите внимание, что определение фактического времени запуска немного сложнее.Когда вы начинаете загружать netStream, значение времени равно нулю, но когда оно показывает первый кадр и ожидает заполнения буфера (пока не воспроизводится), значение времени будет примерно равно 0,027 (зависит от видео), поэтому вам нужноочень тщательно отслеживать это значение для точного определения событий.

Альтернативой использованию NetStream является встраивание видео в SWF-файл, что должно значительно упростить синхронизацию (особенно если вы используете частые ключевые кадры при кодировании).Но вы потеряете соотношение качества и размера файла (если я правильно помню, вы можете использовать только FLV, а не h264).

0 голосов
/ 09 ноября 2010

Единственное, что приходит на ум, - это попытаться использовать метаданные, флэш-медиапотоки поддерживают метаданные и обратный вызов onMetaData. Я предполагаю, что вы используете флэш-медиа-сервер для входящего звука и для записи выходящего звука. Если вы используете метод send во время потоковой передачи звука обратно на сервер, вы можете поместить в него метку времени воспроизведения для прослушиваемой звуковой дорожки, поэтому, когда вы вернете 2 потока обратно на сервер, вы можете смешать их вместе должным образом. Вы также можете попробовать закодировать аудио, которое передается клиенту с метаданными, и попытаться использовать onMetaData для их синхронизации. Я не уверен, как это сделать, но второй подход состоит в том, чтобы попытаться объединить 2 потока вместе, так как звук возвращается, чтобы вам не нужно было их мультиплексировать позже, или присоединить его к пустому видеопотоку с 2 звуковые дорожки ...

...