Кодирование MPEG-TS - PullRequest
       71

Кодирование MPEG-TS

10 голосов
/ 25 ноября 2011

У меня есть файл, который мне нужно преобразовать в MPEG-TS, чтобы он соответствовал приведенной ниже спецификации:

Элементарный поток битрейта [кбит / с] видео: 2575 аудио: 2 x 192 субтитров: - PAT/ PMT: - Наполнение: -

Компонент TS Битрейт [кбит / с] Видео: 2652 Аудио: 395 Подзаголовок: 45 PAT / PMT: 45 Наполнение: 62 Всего: 3200 CBR

Требуется дополнительноКомпоненты: PAT PMT Пустые пакеты

Компоненты, которые могут появиться: NIT, SDT, EIT и т. д.

vcodec="h264"
acodec="mpga"
bitrate="2500"
arate="192"
samplerate=48000
ext="mpg"
mux="ts"
vlc="/usr/bin/vlc"
fmt="mpg"
dst="/home/adam/test/"

for a in *$fmt; do
$vlc -I dummy -vvv "/home/adam/test/" --sout "#transcode{vcodec=$vcodec,venc=x264{profile=main,level=3.0,hrd=cbr,bframes=2},vb=$bitrate,acodec=$acodec,ab=$arate,samplerate=$samplerate,channels=2}:standard{mux=$mux,dst=\"$dst$a.$ext\",ac$
done

После кодирования с помощью приведенного выше сценария все в порядке (для обоих видеои кодек аудио битрейт является постоянным), кроме двух вещей: битрейт контейнера также должен оставаться CBR, но это не так.Также отсутствует компонент заполнения (0x1 ffff) - нулевой пакет.Можно ли исправить сценарий, чтобы сделать нулевой пакет, а также битрейт постоянной контейнера (3,2 Мбит / с CBR)?

Второй вариант - кодирование с помощью ffmpeg:

ffmpeg -i video_input.mpg -i audio_input.mp2 -acodec copy -tune zerolatency -x264opts bitrate=2600:vbv-maxrate=2600:vbv-bufsize=166:nal_hrd=cbr -vpre libx264-iptv -vcodec libx264 -f mpegts -muxrate 3200K -y output.ts

а как сбросить / отключить / удалить таблицу SDT?

1 Ответ

7 голосов
/ 27 ноября 2011

Учитывая, что вам известна концепция NULL-пакетов, вы, возможно, работали с программным или аппаратным обеспечением коммерческого уровня в этой области.

Существует разница между CBR (видео) и системной скоростью (или скоростью мультиплексора). Когда видео кодируется как CBR, скажем, со скоростью 3,2 Мбит / с, вполне нормально, что оно колеблется на несколько сотен кбит / с вокруг этого поля. Так что пиковый битрейт, можно сказать, 3,3 Мбит / с. Это вполне нормально. При добавлении еще 100 кбит / с аудио общий максимальный битрейт может составить 3,4. Обычно в этом случае скорость системы будет выше 3,6 Мбит / с; где баланс - пустые пакеты.

Системная скорость 3,5 Мбит / с НЕ МОЖЕТ колебаться вообще. Если это произойдет, синхронизация на основе ПЦР не будет работать и, в основном, вещи не будут работать в реальной среде. Таким образом, в принципе, вы можете думать о 3,5 Мбит / с (около 240 пакетов в 100 миллисекундах) как о BUS. каждое место должно быть заполнено, чтобы обеспечить непрерывную транспортировку. Обычно это делается таким образом, что несколько мест остаются пустыми.

Самое печальное, что ни VLC, ни какой-либо другой инструмент с открытым исходным кодом не сделают это за вас.

Хак, который мы использовали, заключался в том, что мы использовали для отправки такого потока, созданного VLC, по IP-адресу (где отправка потока TS без пакетов NULL - это нормально - и получение этого через выход мультиплексора с ASI или такой интерфейс, который будет добавили глушитель.

В качестве альтернативы вы можете использовать Manzanita muxer , чтобы преобразовать ваш ненулевой поток TS в правильный поток TS.

EDIT:
На основании комментария - если все, что вам нужно сделать, это отключить SDT - необходимо сделать две вещи.

  1. Удалить все пакеты из PID, который соответствует таблице SDT. Если вы не полностью демультиплексируете и ре-мультиплексируете - быстрый способ сделать это - повторно пометить 13-битный номер PID номером PID пакета NULL.

  2. Удалить ссылку на значение PID SDT в таблице PAT. По сути, это означает, что вы создаете 3-4 пакета, которые исправлены PAT; и замените все последовательности пакетов PAT в потоке этими исправленными пакетами.

...