gpt4 book ai didi

c++ - 使用 Ffmpeg 传输 SEI

转载 作者:行者123 更新时间:2023-11-28 05:58:37 27 4
gpt4 key购买 nike

我需要通过Ffmpeg的帮助从无人机传输一些数据。数据包括帧数据和一些其他参数,例如无人机的定时滚动/俯仰/高度/方向,以及我何时获取帧的图像,相应的参数也要拉出来,所以我决定把这些参数作为SEI发送。 那么问题来了,发送sps pps后,我发送自己的SEI包,eg:

 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 的 metadate 中,但在 rtp 传输后,收到 AVFrame 的 side_data 和元数据再次为 0x00。 谁能给我一些思路?

最佳答案

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

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

关于c++ - 使用 Ffmpeg 传输 SEI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33705840/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com