【问题标题】:Transport SEI With Ffmpeg使用 Ffmpeg 传输 SEI
【发布时间】:2016-08-29 19:42:38
【问题描述】:

我需要通过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 什么也没有! 此外,我还尝试将我的参数放在 AVFrame 的 side_data 或元数据中,但是在 rtp 传输后,收到了 AVFrame 的 side_data 和元数据再次为 0x00。 谁能给我一些思路?

【问题讨论】:

    标签: c++ ffmpeg h.264 rtp multimedia


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2017-08-11
      • 2013-01-11
      • 2020-10-06
      • 1970-01-01
      相关资源
      最近更新 更多