使用Ffmpeg运输SEI

Transport SEI With Ffmpeg

本文关键字:SEI 运输 Ffmpeg 使用      更新时间:2023-10-16

我需要通过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什么都不做!此外,我还试图将我的参数放在AVFrame的side_data或metadate中,但在rtp转换后,我再次收到了AVFrame的side _data和元数据0x00。有人能给我一些思路吗?

在接收终端,您是否检查过使用av_read_frame()获得的AVPackets的数据上是否有您的SEI消息?除了编码部分外,我为每帧保存SEI的方法与您的方法类似。我的步骤是:

  1. 首先,我使用x264库对帧进行编码(我认为这不会有什么不同)
  2. 然后,就像你一样,我先写()一个数据包,然后写一个SEI(你不必为SEI显式地声明AVPacket,也不需要为SEI使用packet->data,只需声明uchar*或uint8_t*)
  3. 使用av_read_frame()后,SEI消息与编码帧一起出现在packet->数据上
  4. 在编码帧的最后一个字节之后,我从packet->数据中获得SEI消息。(实际上,你无法确定编码帧的最后一个字节。但你可以做一个技巧,在SEI上指示它的长度)
  5. 最后,在不修改packet->数据的情况下,我用通常的方式对帧进行解码