c++ - 将帧号/索引添加到 AVFrame 对象

标签 c++ ffmpeg libav

我有一个应用程序可以对来自 H264 摄像机的视频流进行编码并将其存储在磁盘上。在应用程序的另一部分,我正在加载这部电影并将其展示给用户。除了我在编码帧时添加的唯一帧索引号与我在解码文件时获得的帧号不同之外,所有这些都有效。
这是我编码帧时的代码片段。我使用“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);
}

最佳答案

查看AVFrame结构文档。

  • 您不能设置 display_picture_number 因为这在编码期间不会被 ffmpeg 处理
  • 您可以使用 AVFrame 的 metadata而是存储一些“笔记”
  • 关于c++ - 将帧号/索引添加到 AVFrame 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70850796/

    相关文章:

    c++ - 在使用库和 CMake 时遇到问题

    c++ - AVFrame buf 大小计算

    c++ - 达到 int_max 之前的迭代次数

    c++ - 将c代码链接到c++代码时的g++链接顺序依赖性

    android ffmpeg build 去掉版本号

    ffmpeg - 使用 FFmpeg 实现 HLS

    html - 如何通过 nginx 将 rtsp 网络摄像机流式传输到网站

    ffmpeg - 如何使用 libav ffmpeg 从 h264 视频中获取 sps 结构

    linux - VLCJ JPanel播放视频流预览

    c++ - 为包装列表自定义迭代器