У вас есть данные 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 как способ преобразования типов.

Надеюсь, это поможет! Удачи!