video - RGB 帧编码 - FFmpeg/libav

标签 video encoding ffmpeg video-encoding libavcodec

我正在学习 FFmpeg 中的视频编码和解码。我在 page 上尝试了代码示例(仅视频编解码部分)。这里创建的虚拟图像采用 YCbCr 格式。如何通过创建 RGB 帧来实现类似的编码?我被困在:

首先,如何创建这个RGB虚拟框?

其次,如何编码呢?使用哪个编解码器?它们中的大多数仅适用于 YUV420p...

编辑: 我有一个 YCbCr 编码器和解码器,在这个 page 上给出。 .问题是,我的数据库中有 RGB 帧序列,我需要对其进行编码。但是编码器是针对 YCbCr 的。所以,我想知道以某种方式将 RGB 帧转换为 YCbCr(或 YUV420P),然后对其进行编码。 在解码结束时,我得到解码的 YCbCr 帧并将它们转换回 RGB。如何推进?

我确实尝试过 swscontext,但转换后的帧会丢失颜色信息和缩放错误。我想使用两个 for 循环和 colorspace conversion formulae 手动完成它 但我无法使用 FFmpeg/libav 库访问帧的单个像素!就像在 OpenCV 中一样,我们可以使用类似以下内容的方式轻松访问它:Mat img(x,y) 但这里没有这样的东西!我完全是这个领域的新手......

有人可以帮助我吗?

非常感谢!

最佳答案

最好的转换方式是使用 swscale。您可以手动完成,但您的版本会更慢。 ffmpeg 中没有访问像素数据的 API。您必须直接访问缓冲区 YUV420P 是一种平面格式,因此第一个缓冲区是 Y 平面,每个像素 1 个字节。 U/V 平面为 4 个像素的 1 个字节。这是因为在亮度 (Y) channel 包含最多信息的假设下,U 和 V 平面被缩放到 Y 平面的 1/4 大小。

00250     picture->data[0] = picture_buf;
00251     picture->data[1] = picture->data[0] + size;
00252     picture->data[2] = picture->data[1] + size / 4;

其次,让我们看一下颜色空间转换。

void YUVfromRGB(double& Y, double& U, double& V, const double R, const double G, const double B)
{
  Y =  0.257 * R + 0.504 * G + 0.098 * B +  16;
  U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
  V =  0.439 * R - 0.368 * G - 0.071 * B + 128;
}

并插入一些虚拟值:

R = 255, G = 255, B = 255
Y =  235

R = 0, G = 0, B = 0
Y = 16

如您所见,范围 0 -> 255 被压缩为 16 -> 235。因此我们已经表明,RGB 色彩空间中有一些颜色在(数字)YUV 色彩空间中不存在。那我们为什么要用YUV呢?这就是彩色空间电视使用的方式,可以追溯到 1950 年,当时彩色 channel (U/V) 被添加到现有的黑白 channel (Y) 中。

在这里阅读更多: http://en.wikipedia.org/wiki/YCbCr

缩放错误是您没有正确使用 swscale。您很可能不理解行跨度: http://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx .

我不知道有任何在 RGB 色彩空间中运行的视频编解码器。您可以使用 libswscale 在 RGB 和 YUV 之间转换(稍微有损)。

本视频将解释: https://xiph.org/video/vid2.shtml

关于video - RGB 帧编码 - FFmpeg/libav,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21484579/

相关文章:

javascript - 如何在页面加载后立即使用自动启动参数暂停 Brightcove 视频?

json - 结果打印空 Json

java - 谁在 Spring MVC 中设置请求内容类型

ffmpeg - 如何将 webm 视频与具有透明度的 mp4 视频合并?

javascript - 如何从 JS 浏览器客户端使不可流式传输的 mp4 流式传输?

java - 如何在java中获取视频的缩略图(格式MJPEG)

android - 在 WebView 中从 Facebook 获取视频 url

c++ - 使用随机访问解码 H264

python-3.x - 如何在 MacOS 的 Sublime Text 3 中更改首选编码

从 npm 安装的 firebase 部署和二进制文件?