mpp硬解码显示Mppframe

使用ffmpeg+mpp进行硬解码显示,用FFMPEG读取AVPacket,再使用MPP进行硬解码,将AVPacket转换成MppPacket以后进行硬解码得到MppFrame,如何将MppFrame转换成AVFrame呢?或者得到MppFrame以后如何显示,有哪些方法呢?

回答整理来自ChatGpt,如果对你有帮助麻烦采纳一下,谢谢啦
要将MppFrame转换为AVFrame,您需要进行以下步骤:

创建一个AVFrame对象,使用av_frame_alloc函数分配内存空间,并设置AVFrame的格式、宽度、高度和对齐方式等属性。

将MppFrame的数据复制到AVFrame中。可以使用av_image_copy函数进行数据的复制,将MppFrame中的数据复制到AVFrame中。

设置AVFrame中的时间戳和其他属性。可以使用AVPacket中的时间戳和其他属性来设置AVFrame中的属性。

将AVFrame传递给FFmpeg的其他函数进行后续处理。

要显示MppFrame,有以下几种方法:

使用FFmpeg提供的视频渲染器来显示视频。您可以使用FFmpeg提供的SDL或者OpenGL等视频渲染器来显示视频,具体使用方法可以参考FFmpeg官方文档。

使用其他第三方库来显示视频。除了FFmpeg提供的视频渲染器外,还有其他第三方库也可以用来显示视频,例如OpenCV、Qt等。

自己编写视频渲染器来显示视频。如果您有视频渲染器的开发经验,可以编写自己的视频渲染器来显示视频。

MppFrame保存下来就是YUV文件嘛,可以直接用ffmpeg进行播放,MppFrame有多个类型,如果是YUV420P就可以直接当AVFrame使用


SDL_Window* window = nullptr;
SDL_Renderer* renderer = nullptr;
SDL_Texture* texture = nullptr;

// 初始化 SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    // 初始化失败,处理错误
}

// 创建窗口
window = SDL_CreateWindow("MppFrame Display", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, avFrame->width, avFrame->height, SDL_WINDOW_SHOWN);
if (!window) {
    // 窗口创建失败,处理错误
}

// 创建渲染器
renderer = SDL_CreateRenderer(window, -1, 0);
if (!renderer) {
    // 渲染器创建失败,处理错误
}

// 创建纹理
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, avFrame->width, avFrame->height);
if (!texture) {
    // 纹理创建失败,处理错误
}

// 更新纹理数据
SDL_UpdateYUVTexture(texture, nullptr, avFrame->data[0], avFrame->linesize[0], avFrame->data[1], avFrame->linesize[1], avFrame->data[2], avFrame->linesize[2]);

// 渲染纹理到窗口
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, nullptr, nullptr);
SDL_RenderPresent(renderer);

// 等待窗口关闭事件
SDL_Event event;
while (SDL_WaitEvent(&event)) {
    if (event.type == SDL_QUIT) {
        break;
    }
}

// 释放资源
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();