Почему ffmpeg удаляет сообщения SEI при преобразовании FLV в h264? - PullRequest
1 голос
/ 21 июня 2020

У меня есть FLV-файл с видео тегами h264. Каждый видеотег, содержащий блок NAL IDR h264, также содержит SEI ориентации дисплея, ie моя единица доступа NAL для ключевых кадров IDR - [SEI, IDR].

По какой-то причине преобразование этого FLV-файла в h264 без опции копирования потока удаляет все сообщения SEI из всех кадров IDR. Вместо него, сразу после блоков SPS и PPS NAL, есть незарегистрированные данные одного пользователя SEI.

, т.е. использование

ffmpeg -i in.flv out.264

дает [SPS, PPS, SEI, IDR, .. .], где SEI:

x264 - ядро ​​155 r2917 0a84d98 - H.264 / MPEG-4 AV C код c - Copyleft 2003-2018 - http://www.videolan.org/x264.html - опции: cabac = 1 ref = 3 deblock = 1: 0: 0 analysis = 0x3: 0x113 me = hex subme = 7 psy = 1 psy_rd = 1.00: 0.00 mixed_ref = 1 me_range = 16 chroma_me = 1 trellis = 1 8x8dct = 1 cqm = 0 мертвая зона = 21,11 fast_pskip = 1 chroma_qp_offset = -2 потока = 11 lookahead_threads = 1 sled_threads = 0 nr = 0 decimate = 1 interlaced = 0 bluray_compat = 0 constrained_intra = 0 bframes = 3 b_pyramid = 2 1 b_bias = 0 direct = 1 weightb = 1 open_gop = 0 weightp = 2 keyint = 250 keyint_min = 25 scenecut = 40 intra_refresh = 0 rc_lookahead = 40 rc = crf mbtree = 1 crf = 23.0 qcomp = 0.60 qpmin = 0 qpmax = 69 qpstep = 4 ip_ratio = 1,40 aq = 1: 1,00

Однако

ffmpeg -i in.flv -c:v copy out.264

сохраняет мои сообщения SEI и в значительной степени декодирует в необработанный h264, который я помещаю в FLV m uxer для создания файла FLV в первую очередь. Почему это происходит? Есть ли флаг для выполнения кодирования, но сохранения сообщений SEI?

1 Ответ

1 голос
/ 22 июня 2020

Используя - c: copy, ffmpeg не декодирует h264, он просто копирует NALU из источника в место назначения, даже не глядя на них. Следовательно, каждый NALU сохраняется.

При транскодировании ffmpeg теряет метаданные при декодировании. Потребуется взять SEI, установить его как метаданные для AVFrame, а затем записать SEI в новый кадр при его повторном кодировании. Но SEI - это объект для каждого AU. Это означает, что если вы измените частоту кадров, ffmpeg нужно будет знать, как разделить или объединить SEI в новую частоту кадров. Это большой объем кода, который еще никто не написал. Можно было бы скопировать SEI, не меняя частоту кадров, или написать обработчики слияния / разделения для всех известных типов SEI. Но кто-то должен спонсировать эту работу.

Ffmpeg имеет открытый исходный код, и если бы вы разработали этот код, очень вероятно, что они приняли бы патч.

...