如何从FFmpeg提取10bit视频得到的16位PNG中获取10bit RGB值
你当前输出的16位PNG的像素值是原始10bit RGB值左移6位后得到的结果(因为16位的位宽比10位多6位,FFmpeg会在10bit值的低位补0填充到16位),要得到0~1023的10bit值,直接对每个通道的16位像素值做整数除以64(或右移6位)操作即可,这个方法精度最高,不会引入浮点运算误差。
举个验证例子:原始10bit最大值是1023,左移6位后得到 1023 * 64 = 65472,和16位理论最大值65535的差值是低位补0带来的,直接整数除法忽略即可,运算后刚好得到1023的原始值。
如果你还没开始提取帧,也可以直接修改FFmpeg命令直接输出10bit原始RGB数据,省去后续转换步骤:ffmpeg -i 10-bit-video.mp4 -pix_fmt gbrp10le -f rawvideo output_10bit_rgb.raw
如果需要用代码批量处理已生成的16位PNG,可以参考下面的Python示例:
from PIL import Image import numpy as np # 读取16位深度PNG img = Image.open("test_001.png").convert("I;16") img_np = np.array(img) # 右移6位还原为10bit值 img_10bit = img_np >> 6 # 输出验证,最大值应为1023 print(f"10bit像素最大值:{img_10bit.max()}")
内容的提问来源于stack exchange,提问作者Yineng Xiong
相关产品推荐
相关产品推荐

