Синхронизация воспроизведения видео по сети - PullRequest
4 голосов
/ 11 марта 2011

Я сделал медиаплеер, который воспроизводит практически все, что ему запланировано, через текстовый файл. Плеер также может воспроизводить один и тот же клип на нескольких компьютерах (ПК). Проблема в синхронизации. Одно и то же видео начинает воспроизводиться на каждой из машин, но оно выходит примерно на 400 мс, что выглядит дерьмом, а если есть звук, то еще хуже.

На данный момент я делаю:

Одна машина настроена как ведущая, а все остальные машины настроены как подчиненные. Мастер решает, какой предмет будет сыгран. Он ожидает сообщения от каждого из ведомых, после того как все ведомые подключены (или по истечении времени ожидания), он передает идентификатор элемента файла, который необходимо воспроизвести. Затем все машины начнут воспроизводить этот файл.

Что я тоже пробовал:

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

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

Это, к сожалению, не улучшило проблему. Теперь я почти уверен, что рассогласование синхронизации связано с задержкой в ​​сети. Как я могу компенсировать это? Или, может быть, определить задержку для каждого раба?

Все сетевые коммуникации выполняются с помощью winsock.

Любые мысли или идеи очень ценятся.

Ответы [ 3 ]

2 голосов
/ 11 марта 2011

Насколько я понимаю, наиболее близким приближением к их точной синхронизации является:

Частичное решение:

Мастер: отправьте сообщение воспроизведения с отметкой временидля клиентов.
Клиенты: Когда сообщение воспроизведения получено, ответьте подтверждением.Прочитайте метку времени, подсчитайте, сколько времени понадобилось, чтобы прибыть сообщение, и задержите начало воспроизведения на эту разницу во времени.
Мастер: Когда сообщение с подтверждением получено, воспроизведите немедленно.

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

Альтернативное решение:

Мастер: при отправкесообщение воспроизведения, отправьте время начала (самое высокое время приема-передачи среди всех клиентов) для клиентов, чтобы начать воспроизведение, и должны запланировать воспроизведение на предоставленное время.
Клиенты: когда сообщение воспроизведения получено, они должныЗапланируйте воспроизведение на указанное время.

1 голос
/ 15 июня 2011

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

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

Возможно, вы могли бы транслировать все прослушивающие машины одновременно, чтобы избежать этого.

1 голос
/ 11 марта 2011

Вы можете использовать известные протоколы потоковой передачи, такие как RTP (или другие), чтобы сделать работу. Чтение файла по сети (а это, по-видимому, то, что вы делаете) склонно к сетевым задержкам, и если требуемая точность составляет миллисекунды - у вас есть ограничения в реальном времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...