2015-11-14 3 views
0

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

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: API av_read_frame.The только декодировать каждый полный кадр из AVFormatContext.My SEI ничего не выйдет! Кроме того, я также пытаюсь поместить мои параметры в side_data или метаданные AVFrame, но после tt-трансляции rtp полученные боковые_данные и метаданные AVFrame снова будут 0x00. Может ли кто-нибудь дать мне некоторую мысль?

ответ

1

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

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