【问题标题】:Display YUV/RGB frames on FFPLAY window在 FFPLAY 窗口上显示 YUV/RGB 帧
【发布时间】:2013-12-04 08:42:27
【问题描述】:

我在FFMPEG 框架上集成了一个自定义解码器。此解码器的输出是 YUV420 帧,如果需要我可以将其转换为 RGB24 帧。

这些框架是在我的一个自定义函数中生成的。那么为了在FFPLAY 窗口上渲染这些帧需要做什么呢?有什么特定的语法或程序可以遵循吗?

我真的是FFPLAY 的新手,并且已经在网上对该主题进行了足够多的搜索,但没有得到与此问题相关的任何信息。如果有人可以对此提供任何答案或建议,那将对我有很大帮助。

提前致谢。

--问候

【问题讨论】:

  • 您是在播放文件还是通过管道输入?如果是文件,请提供一个简短的样本。您是在使用 ffplay cli-tool 还是以编程方式使用?
  • 如果您已经为 FFmpeg 编写了一个新的解码器,它本机输出 YUV 4:2:0,那么 FFplay 应该能够在不进行任何修改的情况下播放视频。您确定要将颜色空间从解码器传递到核心引擎吗?
  • @MultimediaMike:感谢您的回复。我一直在等待这样的答复。是的,在我的本机代码(即 C 代码)中,我能够生成 YUV 420 帧。然而,正如我告诉过你的那样,我对这个 ffplay 东西真的很陌生,我现在有一个想法:如何将色彩空间从我的解码器传递到核心引擎。任何可以让我对此有所了解的文件或任何文章,请将其作为回复发布在这里,我将接受它。 --等待您的回复。

标签: video ffmpeg rendering yuv libavcodec


【解决方案1】:

我对破解 FFmpeg 的编解码器有点生疏,但我刚刚检查了最新的 git 源代码,我假设您使用的是同一个副本。我进一步假设您将解码器与 libavcodec/ 目录中的其余编解码器一起插入,并且当您构建程序并运行 ffmpeg -formats 时,您会看到提到的新解码器。

如果这一切都是真的,那么我将假设您的解码器模块导出了一个 init() 函数,该函数期望接收指向 AVCodecContext 函数的指针。此数据结构有一个名为 pix_fmt 的成员,在您的解码器中,该成员应设置为 AV_PIX_FMT_YUV420P,以指示平面 YUV 4:2:0。

如果这不起作用,请尝试使用ffmpeg 工具将文件解码为空目标,以测试您的解码器是否正在执行某些操作:

ffmpeg -i yourfile.ext -f null /dev/null

使用此命令的输出修改您的问题,为我们提供更多线索。

【讨论】:

  • 感谢您的回答。我的解码器带有 init,但我没有指定像素 fmt 变量。当给出命令 ffmpeg --decoders 时,我可以在列表中看到我的解码器名称。但是我不应该将此输出帧映射到 SDL 帧之类的东西(因为 ffplay 使用了 SDL 库)吗?正如我所说,YUV 帧与其他解码器在不同的流程中生成。你能说明一下这个问题吗? (我的意思是 SDL 映射)
  • 视频解码器不需要任何视频输出层的知识。解码器应该只解码为最有效的像素格式(平面 YUV 4:2:0),将帧传回引擎,让引擎弄清楚如何处理它。输出可以是 SDL 窗口、X11 窗口、OpenGL 表面或磁盘上的文件。换句话说:基本的 H.264 视频(查找 MP4 文件)应该使用 ffplay 播放。 H.264 视频解码器输出平面 YUV 4:2:0 数据,然后将其传递回引擎,然后将其发送到 SDL。这也是你的解码器应该表现的方式。
  • 这真是太棒了......你刚刚提供的解释。非常感谢:-)
猜你喜欢
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多