В процессе разработки системы вещания я столкнулся с проблемой, с которой, наверное, сталкиваются все разработчики подобных систем - это синхронизация аудио и видео.
Свою систему я построил таким образом, что один рабочий поток программы занимался перекодированием видео, другой - аудио. Затем результаты мультиплексировались. В итоге при просмотре плеером наблюдалась значительная рассинхронизация.
Сперва я попробовал её решить, что называется, “в лоб”. Я заметил, что рассинхронизация на каждом из каналов была каждый раз одинакова, в итоге я просто в нужный поток выполнения программы добавил соответствующую задержку. И это отлично сработало - рассинхронизация исчезла.
Но моя радость длилась недолго. Всё работало ровно до того момента, пока я работал только с одним тв каналом. Как только я запускал в параллельную обработку несколько каналов, всё рушилось - задержка становилась плавающей и мой метод не срабатывал. Да оно и понятно, добавление задержки в нужный поток выполнения - это как попытка подогнать результат, но не решить проблему.
Так что единственный рабочий способ - это синхронизация по меткам PTS, излекаемым из Mpeg-2 потока. Что я и сделал, и это полностью решило проблему.
Игорь, Октябрь 2012.
|