У вас есть данные SEI типа незарегистрированных пользовательских данных, которые вы хотите извлечь из потока H.264? Вы используете FFMPEG? У меня недавно тоже была эта проблема, и я не нашел никакой документации по ней в Интернете, поэтому я подумал, что покажу вам, как я это сделал.
TL; DR; вам придется вручную расшифровать его самостоятельно.
В h264_sei.c
есть метод decode_unregistered_user_data
. Этот метод автоматически вызывается FFMPEG, когда кадр декодируется, и он обнаруживает, что в потоке есть данные SEI незарегистрированного типа. Это правильное место для декодирования ваших данных незарегистрированного пользователя.
В этот метод передаются параметры H264Context
и размер. Размер (в битах!) Полезной нагрузки SEI был заранее определен в контексте вызова в методе ff_h264_decode_sei
. H264Context
служит параметром входа-выхода. Он содержит необработанные данные, которые вам нужно будет извлечь, а также место, где вы будете хранить данные SEI после декодирования. Я добавил общедоступное свойство под названием unregistered_user_data
к H264Context
, в котором данные хранились после декодирования.
Я ожидал получить свои данные в виде 32-битных блоков, поэтому я просто обработал данные и сохранил их в своем свойстве unregistered_user_data
:
for (i = 0; i < sizeIn32Bits; i++) { uint32_t bytes = get_bits_long(&h->gb, bites32); h->sei_unregistered_user_data[i] = bytes; }
Метод get_bits_long()
используется для извлечения необработанных байтов из GetBitContext контекста.
Как только это будет завершено, я смог извлечь эти данные из H264Context
после того, как закончу декодирование видеокадра. В моем случае я использовал avcodec_decode_video2
, для которого требуется `AVCodecContext`, который можно преобразовать в H264Context
следующим образом:
AVCodecContext *_videoCodecCtx; ... H264Context *context = _videoCodecCtx->priv_data;
FFMPEG использует priv_data
как способ преобразования типов.
Надеюсь, это поможет! Удачи!