【问题标题】:Displaying an AVFrame on the screen with SDL 2.0使用 SDL 2.0 在屏幕上显示 AVFrame
【发布时间】:2013-09-23 13:00:59
【问题描述】:

我在this 教程的帮助下编写了一些代码,并使用了最新的 ffmpeg 和 SDL 开发库。我被困在必须在屏幕上显示解码帧(AVFrame)的地方。我倾向于使用 SDL 2.0 的最新 API(在使用 SDL_Window 的同时使用渲染器和纹理)来完成上述任务在屏幕上显示 AVFrame。坦率地说,我不是 SDL_RendererSDL_Texture 及其相关函数的专家。但我正在阅读 SDL 2.0 官方网站上的文档并逐步完成它们。

有没有办法使用 SDL 2.0 API 执行以下操作:

  • 将原生帧格式转换为 YUV 风格并显示出来。

    (或)

  • 如果可能,显示框架而无需将其从原始格式转换。

我想使用渲染器和纹理来完成上述操作。似乎没有一种简单的方法可以与他们合作。

谁能指导我完成上述任务的步骤?

PS:虽然我没有明确尝试过,但我遇到了一些通过将 AVFrame 格式(本机)转换为 RGB 来在屏幕上显示 AVFrame 的方法。但我不希望将原生帧格式(主要是 YUV)转换为 RGB,因为它的计算成本很高。

格式之间的转换由 sws_scale() 完成

【问题讨论】:

  • 您或许可以在我的 YCbCr (YUV) 查看器中找到一些灵感,该查看器使用 SDL 显示了相当数量的 YUV 格式。 github.com/figgis/yuv-viewer
  • @Fredrik Pihl,感谢您的链接,但我想尽可能多地使用 SDL 2.0。

标签: ffmpeg sdl yuv libavformat video-player


【解决方案1】:

试试SDL2's YUV pixel formats 之一。

它们有几个平面和压缩变体:

SDL_PIXELFORMAT_YV12:平面模式:Y + V + U(3个平面)

SDL_PIXELFORMAT_IYUV:平面模式:Y + U + V(3个平面)

SDL_PIXELFORMAT_YUY2:打包模式:Y0+U0+Y1+V0(1个平面)

SDL_PIXELFORMAT_UYVY:打包模式:U0+Y0+V0+Y1(1个平面)

SDL_PIXELFORMAT_YVYU:打包模式:Y0+V0+Y1+U0(1个平面)

【讨论】:

  • 我已经尝试使用该标志。你能给我一个带有代码 sn-p 的小例子吗?我不知道如何使用它,尤其是在 AVFrame 旁边。我尝试搜索,但没有找到任何内容。
  • Here you golibav 有时喜欢发出不连续的平面 YUV 帧,因此 here 周围的代码创建了一个支持 SDL 的连续缓冲区。
  • @jsp99: SDL2 >= 2.0.1 有 SDL_UpdateYUVTexture() 用于更新平面 YUV 纹理,因此您不必再手动合并 libav 的缓冲区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多