Кодировка MPEG-TS

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

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

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

Дополнительные обязательные компоненты: пакеты PAT PMT Null

Компоненты, которые могут появиться: 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 ответ

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

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

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

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

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

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

РЕДАКТИРОВАТЬ:
Основываясь на комментарии - если все, что вам нужно сделать, это отключить SDT - необходимо сделать две вещи.

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

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

Другие вопросы по тегам