调色中间件应用场景说明
为什么需要调色
在影视创作中,为了准确用画面的色彩表达创作意图或者准确还原色彩的工作过程被称为调色。
在实际的拍摄过程中,往往无法在现场就获取到符合创作者需要的色彩表达的素材,就需要后期进行调色。
一般而言,让被拍到的白色物体或需要呈现为白色的物体呈现出准确的白色(调整白平衡),准确还原色彩(一级调色)、按照创作者希望的对比度、色彩、画面明暗分布(二级调色)都是属于调色的范畴。
更简单的说,在不影响画质的情况下,让画面色彩更舒服。
基本概念介绍
滤镜
我们经常在一些手机视频创作工具中看到滤镜的选项,能够迅速让画面完成风格化。滤镜使用简单却也因此带来了一些问题:
- 丢失画面中的色彩细节,让丰富的色彩过度变成一片一片的色带或者一块一块的色块。
- 丢失画面中的明暗细节,滤镜会整体拉高或者降低画面的亮度,许多没有曝光冗余的素材会引起画面部分区域死黑或死白。
- 无法部分调整画面的对比、色彩和亮度,导致天蓝了,山也蓝了,天红了,草地也红了。
滤镜简单却常常无法实现视频创作者的色彩意图。
灰片
在摄影机、相机、无人机和其他专业相机的拍摄中可以选择记录RAW文件,这些模式往往有较大的调色空间。RAW文件往往以10bit以上的规格进行无压缩或几乎无损压缩的格式记录。10bit和8bit数据最大的区别是红绿蓝三色亮度的动态范围。
数据存储时红绿蓝三色中的每一种颜色至少都有1024个亮度值,也就是常说的10bit格式,能够表现出超过10亿种颜色。而无需调色的709色彩空间直出文件只有8bit,也就是256个亮度区间,能够表现出超过16万种颜色。
人眼对于绿色最为敏感,相机记录的动态范围和人眼对于红绿蓝三色的感受响应不是完全对应的。按照相机忠实记录下来并且原样显示之后,人眼看到的画面往往是发灰的。有利于更好的展现明暗细节,但是和人的眼睛感官就会有很大的差别。
除了RAW格式之外,摄影机还能提供各种宽容度的Log文件,不同的Log针对不同的亮度区域有不同的取舍。这样的素材一般都被称为“灰片”。
3D LUT
3D Look up table,RGB色彩查找表。应用3D LUT可以把对应着每一个颜色替换成另外一个颜色,有的可以还原灰片的色彩更贴近于人眼所见。有的可以将画面完全转换成不同的风格,这不同于滤镜。
滤镜是针对整个画面的所有颜色向一个颜色的方向转化,而LUT可以针对每个像素对不同颜色进行转换。
合适的还原LUT应用可以近似认为对画面是进行了无损操作。而风格化的二级调色的颜色对应关系也可以保存为一个LUT文件。
调色
影视文件调色往往会针对画面中的亮部、暗部以及人眼最敏感的中灰三种不同区域进行调整,每中区域一般会有亮度调整和校色两种基本操作。下面展示一款调色台:
其中最主要的操作区有三个圆环和三个轨迹球,就针对三种不同的亮度区域的亮度调整和校色操作。软件界面上一般是这样呈现的:
常规操作会先完成一级调色(所得即所见),再进行二级调色(所得即所想)。
传统调色流程
一级调色
准确的还原色彩,是所有调色工作的第一步,也是许多纪实性视频的调色最后一步。可以参考的方式是在达芬奇调色软件中,根据不同的相机套用还原LUT。或者在拍摄时使用色卡,后期时采用达芬奇调色软件选择对应的色卡即可还原色彩。
实现所得即所见。
采用色卡和灰卡,可以快速还原画面的色彩和白平衡。如果采用立方蜘蛛,还能够快速定义画面最低亮度和中灰区域。
二级调色
准确还原色彩和白平衡后,再对画面进行亮度、色彩进行细致调整。可以分区域,分物体进行调整。
比如让草更绿或更黄,山更青或更红,天更蓝或更苍,让人脸更红润或者更蜡黄。让原本不那么白的变成纯白。
二级调色是也可套用风格LUT实现。
为什么使用云服务
自媒体快速出片
时事内容或定期更新的自媒体往往出片的时间预算非常紧张,完成素材拷贝之后很快就要进行初剪并发布,这样的节奏完全无法按照传统的方式,逐个画面,逐个场景的进行调色创作。
但相机保存的灰片即使进达芬奇的批处理流程对于小型工作室也是很大的挑战。使用云服务可以素材阶段即可上传到云端,保存到阿里云OSS之后即可触发函数计算进行媒资处理。而处理可以通过阿里云Serverless工作流设置成具有扩充能力的处理工作流,并对每个中间件处理结果单独保存。工作流中使用的中间件可以使用阿里云函数计算进行部署。可以在阿里云Serverless工作流中设置并行工作流,也可以设置串行的工作流。
例如:原始素材需要进行超分辨率 、SDR转HDR、插帧、调色、SDR调色、生成字幕文件、自动合成摘要、自动合成影片等操作。就可以将不同的中间件放置在工作流的并行或串行环节。
集成播编一体工作流
一方面有快速播出需求,同时对于最终成品有品质要求的情况下,可以采用基于云服务的媒资管理中间件来定制工作流。
通过中间件可以完成高速出样甚至是直播,而原始素材通过OSS分发到传统NAS工作流中。
拍摄时准备工作
相机设置Log模式
虽然阿里云支持Rec709的文件进行调色,但是对于由于Rec709色彩空间就是在8bit下针对人眼观看的标准,可以实现色彩优化的空间非常小。这样的视频可以考虑使用阿里云SDR调色API搭建需要的中间件。
相机应当调整为LOG模式,但阿里云支持的LogC是阿莱的LOG映射格式。
一般而言,阿莱摄影机拍摄的素材不会使用这样中间件进行调色。但可以使用函数容器部署一个可以对各厂商LOG格式转LogC的中间件(以后另出一期再写)。
然而根据我的测试,即使没有使用阿莱摄影机拍摄的LogC素材依然可以实现较好的调色效果。所以可以先将就着这个API用函数计算封装成中间件用着。
另外,千万别在录制RAW格式的时候把Rec709还原LUT烧录进去,这样的话,也就不用调色了。当然我相信导演和摄影指导已经在现场骂人了。
录制规格和格式
阿里云的人工智能视觉生产调色API只能支持最大3860*2160分辨率的画面,也就是UHD(超清),为了拍摄即处理的过程,如果在相机上选择了4K DCI画面,将会超出阿里云的要求,需要增加预处理的中间件,对画幅或分辨率进行调整。
录制格式支持较为丰富,包括:MP4,AVI,MKV,MOV,FLV,TS,MPG,MXF。但根据分析编码格式可支持H264、ProRes,可能支持H265。
特别说明,如果使用BMPCC4K、BMPCC6K等摄影机,只能使用MOV格式采用ProRes编码才能直接上传到阿里云OSS上出发该中间件。
文件大小不能大于1GB,也就是说ProRes中那些码率巨大的编码格式只能处理几秒中甚至一秒的素材。但码率过小会导致画面过度压缩会影响到画面效果。
根据阿里云API能力和应用场景特色,建议该处按照FHD分辨率25/30帧进行录制。后续在工作流中将插帧和超分辨率的API制作成中间件挂载到媒资处理工作流中。
如何搭建影视后期数字助理的调色中间件
硬件设计与OSS
使用支持4G Cat4以上速率的MCU,通过USB OTG的形式接入到摄影机或相机。BMD、索尼、松下、佳能、尼康等厂商的USB接口开放了PTP协议,可以通过该协议直接访问已经录制完成的素材,并实现实时上传到阿里云OSS,该处不适合使用AliOS Things操作系统,应当直接调用阿里云IoT的C SDK实现设备上线并可对其进行AirOTA。
需要对待上传文件进行哈希校验,并使用断点续传能力。
应当选择华东2的OSS作为该项目存储桶,原因文末解释。
函数计算
选择指定存储桶作为调色API的触发器,一旦出现新文件上传并完成哈希校验后立即出发该函数容器。
该函数容器调用阿里云人工智能->视频生产->视频校色能力的API。以下引入阿里云API调试中心的Python实例代码。
# -*- coding: utf-8 -*-# This file is auto-generated, don't edit it. Thanks.importsysfromtypingimportListfromalibabacloud_videoenhan20200320.clientimportClientasvideoenhan20200320Clientfromalibabacloud_tea_openapiimportmodelsasopen_api_modelsfromalibabacloud_videoenhan20200320importmodelsasvideoenhan_20200320_modelsfromalibabacloud_tea_utilimportmodelsasutil_modelsfromalibabacloud_tea_util.clientimportClientasUtilClientclassSample: def__init__(self): passdefcreate_client( access_key_id: str, access_key_secret: str, ) ->videoenhan20200320Client: """ 使用AK&SK初始化账号Client @param access_key_id: @param access_key_secret: @return: Client @throws Exception """config=open_api_models.Config( # 必填,您的 AccessKey ID,access_key_id=access_key_id, # 必填,您的 AccessKey Secret,access_key_secret=access_key_secret ) # 访问的域名config.endpoint=f'videoenhan.cn-shanghai.aliyuncs.com'returnvideoenhan20200320Client(config) defmain( args: List[str], ) ->None: # 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.htmlclient=Sample.create_client('accessKeyId', 'accessKeySecret') adjust_video_color_request=videoenhan_20200320_models.AdjustVideoColorRequest() runtime=util_models.RuntimeOptions() try: # 复制代码运行请自行打印 API 的返回值client.adjust_video_color_with_options(adjust_video_color_request, runtime) exceptExceptionaserror: # 如有需要,请打印 errorUtilClient.assert_as_string(error.message) asyncdefmain_async( args: List[str], ) ->None: # 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.htmlclient=Sample.create_client('accessKeyId', 'accessKeySecret') adjust_video_color_request=videoenhan_20200320_models.AdjustVideoColorRequest() runtime=util_models.RuntimeOptions() try: # 复制代码运行请自行打印 API 的返回值awaitclient.adjust_video_color_with_options_async(adjust_video_color_request, runtime) exceptExceptionaserror: # 如有需要,请打印 errorUtilClient.assert_as_string(error.message) if__name__=='__main__': Sample.main(sys.argv[1:])
根据该项目特点,可以考虑使用TS或Python较为适合。由于转换过程需要时间,也需要单独编写异步状态部分。
工作流
为实现流程整合,将该部分AI能力以函数计算形式封装为中间件,该函数可以被Serverless工作流掉用,当需要将该中间件加入到工作流时,应当取消OSS触发器。
在Serverless工作流的任务步骤中,异步调用函数计算可以更灵活地适应当前任务场景,避免限流等错误,同时可以简化流程中的错误处理和重试逻辑。
工作流中可以集成其他工作流,也可以整合消息服务,以便与现有的本地或云端的媒体资产管理系统结合。
返回的文件仅能保存30分钟,实现异步消息处理后应立即保存到OSS的结果桶当中,并触发其他函数计算容器或其他工作流。
视频调色能力 API 参数详解
视频类型
该能力支持输出 H264、hevc(H265)、ProRes三种编码,H265在相同画质下,文件体积仅H264的一半。但由于该API提供了一个码率的输入参数,则文件大小由码率和时长决定。
比如10Mbps的码率,60秒的体积计算方式如下:
(10Mb/8)*60s = 75MB
文件格式
通常ProRes编码会选择MOV格式,而H264、H265则常选用MP4格式。该处的格式与编码方式无关,所以对于解码器的需求取决于编码选择。
2022年底依然有相当部分的流媒体平台不支持ProRes编码上传。
往往H265的编码文件需要单独购买解码器才能实现回放。目前主流网络平台已经支持H265的流送,不要求客户端有解码器。
为实现较好的兼容性既能满足本地播放又能上传到各个网络平台可以考虑采用H264编码的MP4文件。需要考虑后期制作尽量选择ProRes编码的MOV格式并输出较高码率。如果不考虑直接分发文件和剪辑,仅在网络平台分发选择H265编码的MP4则有较大优势。
分辨率
尽量保持与输入文件的分辨率一致,在码率限制的情况下为保障画面质量可以考虑下变换,但强烈不建议上变换。
原始视频为FHD(1080P)转换为HD(720P)为下变换,FHD(1080P)转换为UHD(2160P)则为上变换。
该API无法在下变换的过程中实现类似超采样的效果,但上变换过程中一定会出现变花模糊的情况。
如果需要使用较高的分辨率,可以考虑针对需要上变换的视频文件进行超分辨率化,阿里云人工智能视觉生产中有相关能力,可以考虑封装为独立的中间件。
为何使用华东2的OSS
华东2的OSS服务可以直接在阿里云API中调用,其他区域的OSS文件需要进行URL地址转换。
写在最后
我会陆续针对在产业场景中的许多应用分享如何利用阿里云的AI能力结合函数计算进行中间件的开发心得与实战总结。不会公布源代码,但从基本原理到架构方式都会做较为细致的介绍。
适合有一定行业开发经验的开发者阅读,也非常欢迎具体行业的从业者与我交流,无论是否从事开发。