9

我有一个来自 Firewire 天文相机的灰度视频流,我想使用 FFmpeg 压缩视频流,但它不接受 MPEG1VIDEO 编解码器的单字节像素格式。如何使用 FFmpeg API 将灰度视频帧转换为 FFmpeg 接受的帧格式?

4

4 回答 4

11

MPEG-1 仅接受 YUV,因此您需要将帧转换为 YUV 格式。使用SwsContext您通过调用创建的结构sws_getContext(),然后使用sws_scale().

于 2011-12-02T08:34:22.123 回答
8

灰度和YUV的关系很简单——YUV的“Y”与灰度完全一样。

将灰度转换为 YUV 的更简单方法是

有关比例之间的转换,请参见此参考:

因此 :

Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

现在:
对于灰度图像 (​​W):

R = W;
G = W;
B = W;

保持这个:

Y[i] = 0.895 * W[i] + 16。
U[i] = 128(固定值)
V[i] = 128(固定值)

您实际上可以使用几乎相同的 Y[i] = W[i]。128 值表示 0-256 有符号到无符号转换的缩放/移位基数中的“0”。

因此,您需要保留的只是将另一个内存区域 Y 和 U 创建为固定值,并将这些帧提供给 ffmpeg。

我不确定,但通过适当地告诉 FFMPEG,它只在内部执行此操作。您提供的 RGB 值也同样包含在此处;这也不是 MPEG 原生的。

所以寻找能够让你做到这一点的 FFMPEG 的 API。

奖金
请记住,在过去的美好时光中,有黑白(灰度)电视机。新的彩电,需要兼容旧的,所以颜色信息以 U 和 V 的形式添加(有时也称为 YCbCr - 其中 Cb 和 Cr 被称为色度,分别是 UV 在这个上下文)。

于 2011-12-16T03:50:25.447 回答
0

如果您只是使用“色调”过滤器,它就可以工作;像这样:

ffmpeg -i inputfile.ogv -vf hue=s=0 outputfile-unsat.ogv
于 2014-10-26T17:17:12.943 回答
-2

ffmpeg 有任何问题,你需要先下载最新版本,它会修复一些 bug:

https://ffmpeg.org/download.html#build-windows
于 2021-06-28T18:47:17.947 回答