Объединение нескольких видеофайлов в один файл mpeg-ts «на лету»

Прежде всего, извините за мой плохой английский. Я пишу сервер потокового видео на C ++. У меня есть несколько файлов mpeg2-ts (фильмы и рекламные объявления), которые мне нужно передавать через HTTP как один TS-FILE. Проблема в том, что каждый файл mpeg-ts имеет свои собственные временные метки (PCR, PTS, DTS). И, как я понимаю, для создания непрерывного потокового потока каждое новое значение PCR (PTS, DTS) должно продолжаться с последнего значения PCR (PTS, DTS).

Вот картинка для лучшего понимания того, о чем я говорю: http://i.stack.imgur.com/vL1m6.png (Я не могу включить свою фотографию прямо в сообщение. Извините)

Мне нужно заменить временные метки pcr`1, pcr`2, pcr`3 новыми. Например, я отправил ts-пакет, содержащий метку времени pcr3, и после еще нескольких ts-пакетов (не содержащих значения PCR) я хочу вставить свое объявление. И мой вопрос: как мне вычислить новые значения для pcr`1, pcr`2, pcr`3 и так далее?

Правильно ли рассчитать битрейт текущего видео, а затем разделить количество битов, отправленных программой с момента последней отметки времени PCR (в нашем случае это pcr3), на эту битрейт? Я имею в виду следующее: (новая временная метка) = (предыдущая временная метка) + (количество битов) / (битрейт). Или есть более эффективный способ сделать это?

Что касается PTS и DTS, я прочитал Вот что эти временные метки могут быть нелинейными. Будет ли правильно рассчитать его относительно последней полученной мной исходной ПЦР? Я имею в виду:

pts_new = (original_pts - last_original_pcr) + pcr_new.
dts_new = (original_dts - last_original_pcr) + pcr_new.

(original_pts - last_original_pcr) is the difference between pts and pcr values
pcr_new is the last modified pcr value

Моя программа может читать и редактировать эти временные метки в потоке mpeg-ts. К счастью, есть много литературы о том, как это сделать. Но как мне рассчитать новые значения для этих временных меток?

Я только начал изучать спецификацию mpeg2-ts, и, пожалуйста, исправьте мои ошибки, если я ошибаюсь в чем-то.
Заранее спасибо. Надеюсь, ты меня понял.

3

Решение

Mpeg2 «Splicing» — это форма искусства, и она намного сложнее, чем объединение двух потоков. Это требует манипуляций, которые многие компании запатентовали (http://www.google.com/patents/US6380991, http://www.google.com/patents/US6806909, http://www.google.com/patents/US6993081)

ответить на некоторые ваши вопросы:
ваш расчет следующего PCR выглядит хорошо, хотя вам нужно принять во внимание многие проблемы совместимости (например, etr290)
для DTS / PTS у вас гораздо больше работы. самый простой сплайс будет просто перенастраивать pts / dts объявления таким образом, чтобы они продолжались с последней отметки времени первого TS.

ad first timestamp = last timestamp + frame interval

хитрость заключается в том, чтобы убедиться, что у вас нет «дыр» ни в метках времени представления, ни в метках времени декодирования. Это сложная часть и требует глубокого понимания в буферах MPEG2 (tstd, eb, mb).

Удачи.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]