【问题标题】:Add frame number/index to AVFrame object将帧号/索引添加到 AVFrame 对象
【发布时间】:2022-01-26 15:30:50
【问题描述】:

我有一个应用程序,它以 H264 对来自摄像机的视频流进行编码并将其存储在磁盘上。在应用程序的另一部分,我正在加载这部电影并将其展示给用户。除了我在编码帧时添加的唯一帧索引号与我在解码文件时得到的帧号不同之外,所有这些都有效。

这是我编码帧时的代码的 sn-p。我使用“display_picture_number”来存储这个唯一的帧号,这是正确的吗?为什么数字不一样?

void MovieCodec::createFrame( const MyImage& image, AVFrame* frame )
{
    frame->format = streamPixelFormat;
    frame->width = image.width();
    frame->height = image.height();
    frame->pict_type = AV_PICTURE_TYPE_P;
    frame->display_picture_number = image.uniqueImageNumber();

    int ret = av_image_alloc( frame->data, frame->linesize, frame->width,  frame->height, AV_PIX_FMT_BGR24, 1);

    if (ret < 0)
    {
        return;
    }

    struct SwsContext* sws_ctx = sws_getContext((int)image.width(), (int)image.height(), AV_PIX_FMT_BGR24,
                                                (int)image.width(), (int)image.height(), streamPixelFormat,
                                                0, NULL, NULL, NULL);

    const uint8_t* rgbData[1] = { (uint8_t* )image.getData() };
    int rgbLineSize[1] = { 3 * (int)image.width() };

    sws_scale(sws_ctx, rgbData, rgbLineSize, 0, image.height(), frame->data, frame->linesize);
}

【问题讨论】:

  • 我不认为你可以设置display_picture_number。如果我没记错的话,这仅由 ffmpeg 设置。此外,我认为您不能信任它,因为它会在刷新编解码器后发生变化。如果要显示特定的帧数,只需根据 fps 计算即可。检查这个 - 可能有帮助 - stackoverflow.com/questions/67397968/…
  • 那么在 AVFrame 类中没有可以存储我唯一帧号的成员变量?

标签: c++ ffmpeg libav


【解决方案1】:

查看AVFrame 结构文档。

  1. 你不能设置 display_picture_number 因为它在编码过程中不会被 ffmpeg 处理

  2. 您可以使用 AVFrame 的 metadata 来存储一些“注释”

【讨论】:

  • 谢谢,我错过了文档的那部分,但这可能是我需要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2017-11-14
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多