当前位置: 首页 > news >正文

音视频-色域

音视频-色域

1. 色域相关

1.1 python测试视频生成

import os
import subprocess
import argparse
import json# 色域配置
COLOR_PROFILES = {"bt601": {"ffmpeg": {"colorspace": "5","color_primaries": "5","color_trc": "6",  # smpte170m},"x264-params": "colorprim=bt601:transfer=smpte170m:colormatrix=bt601","x265-params": "colorprim=bt601:transfer=smpte170m:colormatrix=bt601",},"bt709": {"ffmpeg": {"colorspace": "1","color_primaries": "1","color_trc": "1",},"x264-params": "colorprim=bt709:transfer=bt709:colormatrix=bt709","x265-params": "colorprim=bt709:transfer=bt709:colormatrix=bt709",},"bt2020": {"ffmpeg": {"colorspace": "9","color_primaries": "9","color_trc": "16",  # smpte2084 (PQ)},"x265-params": "colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc",},
}# HDR 配置
HDR_PROFILES = {"hdr10": {"x265": (":master-display=""G(13250,34500)B(7500,3000)R(34000,16000)""WP(15635,16450)L(10000000,1)"":max-cll=1000,400")},"hlg": {"x265": ":transfer=arib-std-b67"  # Hybrid Log-Gamma},# Dolby Vision 需要二次封装
}def probe_video(video_path):"""使用 ffprobe 获取视频流信息"""if not os.path.exists(video_path):return {"error": "文件不存在"}cmd = ["ffprobe","-v", "quiet","-print_format", "json","-show_streams","-show_format",video_path]result = subprocess.run(cmd, capture_output=True, text=True)if result.returncode != 0:return {"error": result.stderr}info = json.loads(result.stdout)video_stream = next((s for s in info.get("streams", []) if s.get("codec_type") == "video"), None)if not video_stream:return {"error": "未找到视频流"}fps = eval(video_stream.get("r_frame_rate", "0/1"))return {"codec": video_stream.get("codec_name"),"pix_fmt": video_stream.get("pix_fmt"),"width": video_stream.get("width"),"height": video_stream.get("height"),"color_range": video_stream.get("color_range", "unknown"),"color_space": video_stream.get("color_space", "unknown"),"color_primaries": video_stream.get("color_primaries", "unknown"),"color_trc": video_stream.get("color_transfer", "unknown"),"fps": fps,}def generate_videos(profile, color_range, bit_depth, out_dir, hdr="off"):os.makedirs(out_dir, exist_ok=True)profiles = [profile] if profile != "all" else list(COLOR_PROFILES.keys())ranges = [color_range] if color_range != "all" else ["tv", "pc"]bits = [bit_depth] if bit_depth != "all" else ["8bit", "10bit"]if hdr == "all":hdrs = ["off"] + list(HDR_PROFILES.keys())else:hdrs = [hdr]results = []for p in profiles:for r in ranges:for b in bits:for h in hdrs:ffmpeg_args = []# 选择像素格式与编码器if b == "8bit":pix_fmt = "yuv420p"encoder = "libx264" if p != "bt2020" else "libx265"else:  # 10bitpix_fmt = "yuv420p10le"encoder = "libx265"# 输出文件名filename = f"{p}_{r}_{b}"if h != "off":filename += f"_{h}"filename += "_1080p.mp4"filepath = os.path.join(out_dir, filename)# 色彩参数ffmpeg_args += ["-pix_fmt", pix_fmt,"-colorspace", COLOR_PROFILES[p]["ffmpeg"]["colorspace"],"-color_primaries", COLOR_PROFILES[p]["ffmpeg"]["color_primaries"],"-color_trc", COLOR_PROFILES[p]["ffmpeg"]["color_trc"],"-color_range", "1" if r == "tv" else "2",]# 编码器私有参数if encoder == "libx264":ffmpeg_args += ["-x264-params", COLOR_PROFILES[p]["x264-params"]]else:x265_params = COLOR_PROFILES[p]["x265-params"]if h in HDR_PROFILES and "x265" in HDR_PROFILES[h]:x265_params += HDR_PROFILES[h]["x265"]ffmpeg_args += ["-x265-params", x265_params]# 构建命令ffmpeg_cmd = ["ffmpeg","-f", "lavfi","-i", "testsrc=duration=10:size=1920x1080:rate=25","-c:v", encoder,"-crf", "23","-preset", "medium",*ffmpeg_args,filepath,]print(f"\n生成视频: {filepath}")try:subprocess.run(ffmpeg_cmd, check=True, capture_output=True)# probe 生成的视频info = probe_video(filepath)results.append((True, filepath, info))print("视频流信息:", info)except subprocess.CalledProcessError as e:results.append((False, filepath, {"error": e.stderr.decode()}))print(f"生成失败: {filepath}\n", e.stderr.decode())return resultsif __name__ == "__main__":parser = argparse.ArgumentParser(description="生成不同色域/位深/HDR 的视频测试文件")parser.add_argument("--profile", default="all", choices=["all"] + list(COLOR_PROFILES.keys()),help="色域 (bt601, bt709, bt2020, all)")parser.add_argument("--range", default="all", choices=["all", "tv", "pc"],help="范围 (tv, pc, all)")parser.add_argument("--bit", default="all", choices=["all", "8bit", "10bit"],help="位深 (8bit, 10bit, all)")parser.add_argument("--hdr", default="off", choices=["off", "all"] + list(HDR_PROFILES.keys()),help="HDR 设置 (off, hdr10, hlg, all)")parser.add_argument("--out", default="output_videos", help="输出目录")args = parser.parse_args()results = generate_videos(args.profile, args.range, args.bit, args.out, args.hdr)print("\n=== 生成结果汇总 ===")for success, filepath, info in results:status = "成功" if success else "失败"print(f"{status}: {filepath}")print(f"  信息: {info}")

1.2 测试视频生成

  • BT.601 TV 范围
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p -colorspace 5 -color_primaries 5 -color_trc 2 -color_range 1 -c:v libx264 -x264-params colorprim=bt601:transfer=bt709:colormatrix=bt601 -crf 23 -preset medium bt601_tv_1080p.mp4
  • BT.601 PC 范围
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p -colorspace 5 -color_primaries 5 -color_trc 2 -color_range 2 -c:v libx264 -x264-params colorprim=bt601:transfer=bt709:colormatrix=bt601 -crf 23 -preset medium bt601_pc_1080p.mp4
  • BT.709 TV 范围
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p -colorspace 1 -color_primaries 1 -color_trc 1 -color_range 1 -c:v libx264 -x264-params colorprim=bt709:transfer=bt709:colormatrix=bt709 -crf 23 -preset medium bt709_tv_1080p.mp4
  • BT.709 PC 范围
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p -colorspace 1 -color_primaries 1 -color_trc 1 -color_range 2 -c:v libx264 -x264-params colorprim=bt709:transfer=bt709:colormatrix=bt709 -crf 23 -preset medium bt709_pc_1080p.mp4
  • BT.2020 TV 范围
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p -colorspace 9 -color_primaries 9 -color_trc 16 -color_range 1 -c:v libx265 -x265-params colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc -crf 23 -preset medium bt2020_tv_1080p.mp4
  • BT.2020 PC 范围
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p -colorspace 9 -color_primaries 9 -color_trc 16 -color_range 2 -c:v libx265 -x265-params colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc -crf 23 -preset medium bt2020_pc_1080p.mp4
  • BT.601 TV 范围(10-bit)
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p10le -colorspace 5 -color_primaries 5 -color_trc 2 -color_range 1 -c:v libx265 -x265-params colorprim=bt601:transfer=bt709:colormatrix=bt601 -crf 23 -preset medium bt601_tv_10bit_1080p.mp4
  • BT.601 PC 范围(10-bit)
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p10le -colorspace 5 -color_primaries 5 -color_trc 2 -color_range 2 -c:v libx265 -x265-params colorprim=bt601:transfer=bt709:colormatrix=bt601 -crf 23 -preset medium bt601_pc_10bit_1080p.mp4
  • BT.709 TV 范围(10-bit)
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p10le -colorspace 1 -color_primaries 1 -color_trc 1 -color_range 1 -c:v libx265 -x265-params colorprim=bt709:transfer=bt709:colormatrix=bt709 -crf 23 -preset medium bt709_tv_10bit_1080p.mp4
  • BT.709 PC 范围(10-bit)
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p10le -colorspace 1 -color_primaries 1 -color_trc 1 -color_range 2 -c:v libx265 -x265-params colorprim=bt709:transfer=bt709:colormatrix=bt709 -crf 23 -preset medium bt709_pc_10bit_1080p.mp4
  • BT.2020 TV 范围(10-bit)
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p10le -colorspace 9 -color_primaries 9 -color_trc 16 -color_range 1 -c:v libx265 -x265-params colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc -crf 23 -preset medium bt2020_tv_10bit_1080p.mp4
  • BT.2020 PC 范围(10-bit)
ffmpeg -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -pix_fmt yuv420p10le -colorspace 9 -color_primaries 9 -color_trc 16 -color_range 2 -c:v libx265 -x265-params colorprim=bt2020:transfer=smpte2084:colormatrix=bt2020nc -crf 23 -preset medium bt2020_pc_10bit_1080p.mp4

文章转载自:

http://OG5pDJnT.yybqf.cn
http://DkjwIlU3.yybqf.cn
http://OMj5AxbQ.yybqf.cn
http://hbHnpUSm.yybqf.cn
http://q1tZuNrP.yybqf.cn
http://UGv1m3V4.yybqf.cn
http://WszcRE3U.yybqf.cn
http://em3QiIwx.yybqf.cn
http://amYv9FtQ.yybqf.cn
http://yKehUlWO.yybqf.cn
http://wk6KIW9Y.yybqf.cn
http://rG93Piky.yybqf.cn
http://KI8yC7Pb.yybqf.cn
http://nZudGXtN.yybqf.cn
http://6761Djeu.yybqf.cn
http://65TuhMAx.yybqf.cn
http://0DukSW0D.yybqf.cn
http://13BmseDu.yybqf.cn
http://nhTzHpsj.yybqf.cn
http://aqEJQSbV.yybqf.cn
http://SD4IQeAL.yybqf.cn
http://Bm1EfhSV.yybqf.cn
http://7dOhh9i6.yybqf.cn
http://1KIRqN0v.yybqf.cn
http://wBfLRl5B.yybqf.cn
http://RUO0aX0u.yybqf.cn
http://sXCsdeNP.yybqf.cn
http://84CVpTKZ.yybqf.cn
http://pn3Lb2nw.yybqf.cn
http://QfACN4GY.yybqf.cn
http://www.dtcms.com/a/383752.html

相关文章:

  • 返利软件的分布式缓存架构:Redis集群在高并发场景下的优化策略
  • 如何让知识上传与查询更便捷
  • set/multiset容器
  • 区块链:搭建简单Fabric网络并调用智能合约
  • Keepalived的详细实操安装流程及其配置文件选项的详解
  • windows下,podman迁移镜像文件位置
  • 技能补全之正则表达式
  • Altium Designer(AD24)打开工程文件的几种方法
  • 26考研——内存管理(3)
  • 知识库缺乏维护和清理机制会造成哪些后果
  • android studio 华为 安装app 层层验证
  • 机器学习(三):决策树
  • 气缸夹爪机构分析
  • np.sum(e_x, axis=-1, keepdims=True)
  • kafka--基础知识点--5.3--producer事务
  • SCI论文组成部分
  • 软考 系统架构设计师系列知识点之杂项集萃(146)
  • C语言之函数
  • A050基于博途西门子1200PLC智能交通灯控制系统
  • shell文本处理三核心:grep(过滤匹配)、sed(流编辑)、awk(结构化分析)
  • 【WIT】编程百问一
  • ros2-tf树查看
  • 速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)
  • MFC仿真
  • Leetcode 19 java
  • Vue3 响应式核心 API
  • linux故障排查
  • 为什么哈希表能 O(1) 查找?——C++ 哈希基础入门
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • 算法——递推求解