将 14 位 TIF 图像转换为 H264 编码帧
Converting 14bit TIF image to H264 encoded frame
背景
我正在尝试将 tiff 图像转换为 h.264 编码帧。我正在使用 FFMPEG 这样做。使用 PNG,我可以使用以下命令进行转换
./ffmpeg -loglevel error -hide_banner -i /path/to/input.png -c:v libx264 -pix_fmt yuv420p10le /path/to/outputFrame.h264
这很好用,给了我一个合适的框架。
PNG 为 16 位灰度。
我尝试了以下使用 14 位灰度 tif 作为输入的方法
./ffmpeg -loglevel error -hide_banner -i /path/to/input.tiff -c:v libx264 -pix_fmt yuv420p10le /path/to/outputFrame.h264
出现错误:
This format is not supported (bpp=14, bppcount=1)
我读过 elsewhere
FFmpeg does support upto 16 bpc RGB TIFFs or 8 bit YUV TIFFs or 16 bit
grayscale ones..
所以用了imagemagick的识别功能来验证我的tif
它说它确实是一个14位灰度灰度图像。
所以我尝试了 10 位版本,除了现在是 bpp=10 而不是 bpp=14 之外,这给了我同样的错误。
然后我认为 pix-fmt 已关闭,所以我尝试使用 10 位图像的 gray10le 但没有成功。同样的错误。
无论如何我都想要图像的完整位深度,所以更喜欢 16 或 14 位解决方案。
我的问题
如何使用 ffmpeg 或 Imagemagick 将 14 位 TIF 转换为 h264 编码帧,以保持 h264 允许的最高位深度?我也不想转换为中间格式。我在 CentOS 运行 Linux
更新
当我使用 TIF 将深度强制降低到 8 并将其发送到上面的 ffmpeg 命令时,它确实通过了,但是当我在 VLC 中打开框架时,它并没有像我时那样出现用 16 位灰度 PNG 做同样的事情...
更新2
根据评论,我尝试将 tif 强制设置为 16 位灰度,并使用我在以 PNG 为中心的 ffmpeg 命令中使用的原始像素格式。
我仍然很难在 VLC 中显示帧,但这可能是由于图像的大小。它很大。我会尝试平铺它以确保数据完好无损。如果它不完整,问题仍然存在。如果它完好无损,我会“回答我自己的问题”
正如 Kesh 在评论中提到的那样:
FFmpeg does not have any non-multiple-of-8 grayscale pix_fmt, which
seems to be the root of your problem. Could you "upsample" tiff data
to 16-bit grayscale with imagemagick (either as another tiff file or a
set of PNG files)? Then, you should be able to feed those images to
FFmpeg to create h264 stream.
他是对的,我确定我的 TIFF 是 16 位灰度而不是 14 位灰度,并且它进入 FFMPEG 没问题。
然后我平铺我的数据来检查它并确保到 h264 的转换按计划进行。看起来不错。
TL;DR 答案
如果您希望它们正确编码为 h.264,请确保进入 FFMPEG 的灰度 TIF 为 8 位或 16 位(8 的倍数)。
背景
我正在尝试将 tiff 图像转换为 h.264 编码帧。我正在使用 FFMPEG 这样做。使用 PNG,我可以使用以下命令进行转换
./ffmpeg -loglevel error -hide_banner -i /path/to/input.png -c:v libx264 -pix_fmt yuv420p10le /path/to/outputFrame.h264
这很好用,给了我一个合适的框架。 PNG 为 16 位灰度。
我尝试了以下使用 14 位灰度 tif 作为输入的方法
./ffmpeg -loglevel error -hide_banner -i /path/to/input.tiff -c:v libx264 -pix_fmt yuv420p10le /path/to/outputFrame.h264
出现错误:
This format is not supported (bpp=14, bppcount=1)
我读过 elsewhere
FFmpeg does support upto 16 bpc RGB TIFFs or 8 bit YUV TIFFs or 16 bit grayscale ones..
所以用了imagemagick的识别功能来验证我的tif 它说它确实是一个14位灰度灰度图像。
所以我尝试了 10 位版本,除了现在是 bpp=10 而不是 bpp=14 之外,这给了我同样的错误。
然后我认为 pix-fmt 已关闭,所以我尝试使用 10 位图像的 gray10le 但没有成功。同样的错误。
无论如何我都想要图像的完整位深度,所以更喜欢 16 或 14 位解决方案。
我的问题
如何使用 ffmpeg 或 Imagemagick 将 14 位 TIF 转换为 h264 编码帧,以保持 h264 允许的最高位深度?我也不想转换为中间格式。我在 CentOS 运行 Linux
更新
当我使用 TIF 将深度强制降低到 8 并将其发送到上面的 ffmpeg 命令时,它确实通过了,但是当我在 VLC 中打开框架时,它并没有像我时那样出现用 16 位灰度 PNG 做同样的事情...
更新2 根据评论,我尝试将 tif 强制设置为 16 位灰度,并使用我在以 PNG 为中心的 ffmpeg 命令中使用的原始像素格式。
我仍然很难在 VLC 中显示帧,但这可能是由于图像的大小。它很大。我会尝试平铺它以确保数据完好无损。如果它不完整,问题仍然存在。如果它完好无损,我会“回答我自己的问题”
正如 Kesh 在评论中提到的那样:
FFmpeg does not have any non-multiple-of-8 grayscale pix_fmt, which seems to be the root of your problem. Could you "upsample" tiff data to 16-bit grayscale with imagemagick (either as another tiff file or a set of PNG files)? Then, you should be able to feed those images to FFmpeg to create h264 stream.
他是对的,我确定我的 TIFF 是 16 位灰度而不是 14 位灰度,并且它进入 FFMPEG 没问题。
然后我平铺我的数据来检查它并确保到 h264 的转换按计划进行。看起来不错。
TL;DR 答案
如果您希望它们正确编码为 h.264,请确保进入 FFMPEG 的灰度 TIF 为 8 位或 16 位(8 的倍数)。