无法解析 h265 流

问题描述 投票:0回答:1

我正在尝试解析来自 h265 相机的流。 live555 库为我提供了在 afterGettingFrame() 中获得的帧。在那里,我解析它们以通过标头“0x00 0x00 0x00 0x01”获取 NALU。当我解析 NALU 的下一个字节并得到它是否是“I”帧后:

  auto t = (buf[0] >> 1) & 0x3f;
  return t == 19 || t == 20;

我得到了 NALU 的示例流:

log info Frame: time=1691746190593, key=true, duration=25230, size=50338
log info Frame: time=1691746190593, key=true, duration=3163, size=3464
log info Frame: time=1691746190713, key=false, duration=37765, size=480
log info Frame: time=1691746190713, key=false, duration=998, size=3274
log info Frame: time=1691746190713, key=false, duration=711, size=420
log info Frame: time=1691746190793, key=false, duration=115679, size=322
log info Frame: time=1691746190793, key=false, duration=1533, size=2437
log info Frame: time=1691746190793, key=false, duration=842, size=286
log info Frame: time=1691746190913, key=false, duration=77556, size=287
log info Frame: time=1691746190913, key=false, duration=1322, size=2693
log info Frame: time=1691746190913, key=false, duration=2059, size=216
log info Frame: time=1691746190993, key=false, duration=117100, size=258
log info Frame: time=1691746190993, key=false, duration=3076, size=2486
log info Frame: time=1691746190993, key=false, duration=396, size=211
log info Frame: time=1691746191113, key=false, duration=81118, size=23
log info Frame: time=1691746191113, key=false, duration=377, size=64
log info Frame: time=1691746191113, key=false, duration=3962, size=10
log info Frame: time=1691746191113, key=true, duration=5140, size=5069
log info Frame: time=1691746191113, key=true, duration=2797, size=49916
log info Frame: time=1691746191113, key=true, duration=1949, size=3493
log info Frame: time=1691746191193, key=false, duration=101536, size=429
log info Frame: time=1691746191193, key=false, duration=1158, size=3186
log info Frame: time=1691746191193, key=false, duration=1146, size=350
log info Frame: time=1691746191313, key=false, duration=77701, size=332

这里有具有相同时间戳的帧,但据我所知,这是可以的。 此外,我应该如何处理它们(具有相同时间戳的帧)?有一些方法:按时间戳连接它们或按 1 解析。我尝试了两种方法都没有成功。 照常解码(适用于 h264):

  AVPacket avpkt;
  av_init_packet(&avpkt);
  avpkt.pts = 0;
  avpkt.dts = 0;
  avpkt.data = data;
  avpkt.size = size;

  int gotFrame = false;

  while (avpkt.size > 0)
  {
    // We must use positive result to move through the data buffer
    auto len = avcodec_decode_video2(av_context_, av_frame_, &gotFrame, &avpkt);
    if (len < 0)
    {
      break;
    }

    avpkt.data += len;
    avpkt.size -= len;
  }

所以,这段代码返回gotFrame=true,我制作了一个jpeg并得到了一张半绿色的图片! 解析这样的流的正确方法是什么?

video-processing video-capture live555
1个回答
0
投票

终于明白了。当我解析 live555 中的帧时,我删除了第一个标头“0001”,因此结果连接帧没有它们,仅来自第一个 NALU。但解码器要求拥有所有 NALU 的标头,包括中间的标头。

© www.soinside.com 2019 - 2024. All rights reserved.