使用Ffmpeg运输SEI
Transport SEI With 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什么都不做!此外,我还试图将我的参数放在AVFrame的side_data或metadate中,但在rtp转换后,我再次收到了AVFrame的side _data和元数据0x00。有人能给我一些思路吗?
在接收终端,您是否检查过使用av_read_frame()获得的AVPackets的数据上是否有您的SEI消息?除了编码部分外,我为每帧保存SEI的方法与您的方法类似。我的步骤是:
- 首先,我使用x264库对帧进行编码(我认为这不会有什么不同)
- 然后,就像你一样,我先写()一个数据包,然后写一个SEI(你不必为SEI显式地声明AVPacket,也不需要为SEI使用packet->data,只需声明uchar*或uint8_t*)
- 使用av_read_frame()后,SEI消息与编码帧一起出现在packet->数据上
- 在编码帧的最后一个字节之后,我从packet->数据中获得SEI消息。(实际上,你无法确定编码帧的最后一个字节。但你可以做一个技巧,在SEI上指示它的长度)
- 最后,在不修改packet->数据的情况下,我用通常的方式对帧进行解码