我有一个来自 Firewire 天文相机的灰度视频流,我想使用 FFmpeg 压缩视频流,但它不接受 MPEG1VIDEO 编解码器的单字节像素格式。如何使用 FFmpeg API 将灰度视频帧转换为 FFmpeg 接受的帧格式?
问问题
21495 次
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 回答