Синхронизация двух AS3 NetStreams

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

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

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

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


person Lowgain    schedule 05.11.2010    source источник


Ответы (4)


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

person superfro    schedule 09.11.2010
comment
Спасибо, метаданные могут мне помочь, хотя я еще не уверен. Кроме того, я использую wowza, а не fms. - person Lowgain; 10.11.2010

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

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


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

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

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

person Aurel Bílý    schedule 09.11.2010
comment
Смогу ли я использовать Socket для подключения к медиасерверу таким же образом, или в этот момент мне нужно будет самому обрабатывать все протоколы и т. д.? - person Lowgain; 10.11.2010
comment
Проблема с синхронизацией в том, что я не могу свести обе дорожки в один файл из-за характера приложения. Когда я начинаю запись, между запуском минусовки и началом записи проходит разное количество времени. Я подключил аудиокабель от разъема для наушников к разъему для микрофона и записал таким образом фоновую дорожку несколько раз и сравнил каждый файл. Каждый из них был смещен на разное время от оригинальной минусовки, если это имеет смысл. - person Lowgain; 10.11.2010
comment
Это действительно раздражает, как сказал Кей - NetStream довольно неточен. Я проверил исходный код OSMF, но все это просто РАСШИРЯЕТ NetStream... Я думаю, вам нужен какой-то собственный код... К сожалению, поиск фреймворка RTMP AS3.0 не дает никаких результатов - я думаю, что все используют AS3 .0 оригинальные библиотеки. Что касается микширования файла - вам не нужно его микшировать... Просто транслируйте аудио от пользователя. Однако задержка микрофона - это другая проблема ... Но я думаю, что это нелегко решить, поскольку она сильно зависит от аппаратного обеспечения пользователя. - person Aurel Bílý; 10.11.2010

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

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

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

person Cay    schedule 10.11.2010
comment
ахах, да, я заметил здесь неточности, посмотрю, смогу ли я что-нибудь сделать со значениями времени, спасибо. учитывая характер приложения, я не знаю, смогу ли я легко обернуть все в SWF (минусовка — это контент, созданный пользователем), но, возможно, я смогу найти способ автоматизировать это - person Lowgain; 12.11.2010

кажется, что никакие события не отправляются при запуске соединения

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

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

person chrixian    schedule 13.11.2010