c циклический буфер с постоянной задержкой для mpeg-ts - PullRequest
0 голосов
/ 22 марта 2012

Не могли бы вы сказать мне лучший способ реализации циклического буфера с постоянной задержкой времени между вводом и выводом в c на Linux.Я пишу в буфер в потоке и читаю его в другом.Мне нужно сохранить постоянную разницу во времени между чтением и записью, а поток записи имеет переменную скорость передачи данных.Теперь я добавляю временные метки каждые несколько пакетов для их синхронизации и получаю временные метки из другого потока, который использует clock_gettime каждые 1 мс.

1 Ответ

1 голос
/ 23 марта 2012

Общий подход правильный, как вы предложили. Однако нужно позаботиться о многих вещах -

  1. Исходная нить, отправляющая в CBuf, и нить-приемник, удаляемая из CBuf.

  2. CBuf должен быть достаточно большим, чтобы данные не терялись.

  3. CBuf должен быть заблокирован обоими потоками, чтобы избежать повреждения.

  4. Данные CBuf должны иметь временную отметку. Эти временные метки должны быть достаточно точными, чтобы не вызывать дрожание передачи.

  5. Резьба приемника должна быть задержана, чтобы не допустить потери потока.

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

Вероятно, если вы думаете о передаче его на какую-либо аппаратную систему снаружи, точность метки времени, равная 1 мс, достаточно низка, поскольку для соответствия требованиям MPEG требуется 500 нс. Однако, если вы используете аппаратный адаптер для передачи, то, как правило, об этом позаботится.

...