Kalombyr
@Kalombyr

Как правильно «разрезать» h264 фал?

Добрый день.
Видеорегистратор пишет на диск файлы в формате "*.h264" в голом виде.
Они прекрасно воспроизводятся плеером VLC.
Мне нужно эти файлы разрезать на несколько. Как я понимаю, это просто фреймы с камеры
Проблема в том, что если я делаю это "влоб", т.е. просто в произвольном месте вырезаю часть и сохраняю как новый файл, VLC их уже не воспроизводит (при нажатии на плей ничего не происходит). Но иногда это всё таки удаётся и файл воспроизводится нормально. Какие-то заголовки нужны?
В общем, как можно разрезать, не используя видеоредакторы и прочее (в планах написать на C++)?
  • Вопрос задан
  • 203 просмотра
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg
Любые ответы на любые вопросы
Коротко - вы опухнете вручную разгребать всю ту чепуху из бит, которой является файл в формате h264. Там контейнер в контейнере контейнером погоняет.

Возьмите libav и не ломайте себе голову.

Длинно:
h264 - это формат сжатия видео, который содержит опорные и всякие разные промежуточные кадры. Опорный кадр содержит в себе все что нужно для инициализации кодека, поэтому, если аккуратно угадать, можно добиться того, что декодер сможет инициализироваться и продолжить работу. Однако для этого, нужно аккуратно проанализировать весь битовый поток.

Далее, сжатое видео может лежать в каком-то медиаконтейнере, которых много. Скорее всего, регик пишет в h264-annex B (это то, что надо гуглить), который является цепочкой блоков NAL разного сорта. Среди них есть блоки, содержащие настройки кодека, по которым можно понять, что вот этот вот кадр - это I-Frame, и на нем можно видео порезать. Но там еще нужно что-то придумывать с метками времени, иначе вместо перемотки у вас получится дурдом.

Каждый блок NAL содержит заголовок, а заканчивается значением 00 00 00 01

Так что первым этапом можете написать дампалку, которая будет выковыривать блоки NAL и писать их размер и тип. Можно нагуглить такую дампалку (они есть) и сидеть, сравниваться.
Ответ написан
PavelK
@PavelK
Простой вариант: из основного файла в каждый "разрезаемый" копировать первые 100-200 байт в начало.
VLC, впринципе, съест. Работать будет не со всем оборудованием, но большинство китайцев не парятся с соблюдением всего стандарта RTSP потока RTP и h.264.

Более правильный и рабочий вариант:
1. В любом месте файл разрезать нельзя.
В файле "фреймы" (так называемые NAL unit), разделённые 4 байтами: "00 00 00 01" - находите ближайшие от места "разреки".
2. Для воспроизведения h.264 нужно передать настройки декодирования. Скорее всего они в самом начале файла будут. Выглядеть должно примерно так:
00000001
SPS (Sequence parameter set)
00000001
PPS (Picture parameter set)
00000001

и тогда всё будет нормально воспроизводиться.
Но Вам придётся хорошенько проштудировать спецификацию h.264 (в особенности про NAL), т.к., возможно, VLC так же первым делом может требовать I-frame (ключевой, без ссылок на предыдущие кадры).
Вкратце, вот: https://yumichan.net/video-processing/video-compre...
Ответ написан
@AlexSku
Программист по автоматике
Есть примеры в библиотеках DirectShow и Media Foundation. Предварительно можно визуально построить граф потоков с помощью приложений GraphEdit и TopoEdit.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы