Транспортный SEI с Ffmpeg

Мне нужно перенести некоторые данные из дрона с помощью Ffmpeg. Данные включают в себя данные кадра и некоторые другие параметры, такие как временной бросок / шаг / высота / направление дрона, и когда я получаю изображение кадра, соответствующий параметры также должны быть извлечены, поэтому я отправляю эти параметры как SEI.
Затем приходят вопросы, после отправки sps pps я отправляю свой собственный пакет SEI, например:

 if(pkt->size>10&&pkt->data[0] ==0
&&pkt->data[1] ==0
&&pkt->data[2] ==0
&&pkt->data[3] ==1
&&(pkt->data[4] == 103 || pkt->data[4] == 104)){
i++;
}
AVPacket *newPacket = nullptr;
// 0 0 0 1 6 8*16
if(i == 2){
i = 0;
newPacket = (AVPacket *)av_malloc(sizeof(AVPacket));
av_init_packet(newPacket);
newPacket->data = new uint8_t[8];
newPacket->data[0] = 0;
newPacket->data[1] = 0;
newPacket->data[2] = 0;
newPacket->data[3] = 1;
newPacket->data[4] = 6;
newPacket->data[5] = 123;
newPacket->data[6] = 134;
newPacket->data[7] = 128;
newPacket->size = 8;
}
av_write_frame(*it , pkt);
av_free_packet(pkt);
if(newPacket){
av_write_frame(*it , newPacket);
av_free_packet(newPacket);
}

Но, при получении завершения, я нахожу только API: av_read_frame. API просто декодирует каждый полный кадр из AVFormatContext. Мой SEI не работает!
Кроме того, я также пытаюсь поместить свои параметры в side_data или метадат AVFrame, но после переноса по протоколу rtp полученные значения side_data и метаданные AVFrame снова равны 0x00.
Может ли кто-нибудь дать мне ход мыслей?

0

Решение

На принимающем терминале вы проверяли, есть ли в ваших AVPackets, полученных вами с помощью av_read_frame (), ваше сообщение SEI на их данных?
Мой подход к сохранению SEI для каждого кадра был похож на ваш, за исключением части кодирования. Мои шаги:

  1. Во-первых, я кодировал кадры с использованием библиотеки x264 (я не думаю, что это будет иметь значение)
  2. Затем, как и вы, я выполняю fwrite () пакет, а затем SEI (вам не нужно подробно описывать AVPacket для SEI и использовать пакет-> данные для SEI, просто объявляйте uchar * или uint8_t *)
  3. После использования av_read_frame () сообщение SEI появляется в пакете-> данные вместе с закодированным кадром.
  4. Я получаю сообщение SEI из пакета-> данных сразу после последнего байта кодированного кадра. (На самом деле, вы не можете определить последний байт кодированного кадра. Но вы можете сделать трюк и указать его длину в SEI)
  5. Наконец, не изменяя пакет-> данные, я декодирую кадр обычным способом.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]