使用FFmpeg计算MPTS文件相同PID流的PSNR报错如何解决?
两个MPTS文件同PID流PSNR计算方案
可行性结论
完全可以实现,你遇到的报错属于参数使用错误导致的问题,并非FFmpeg不支持该场景。
错误原因分析
你收到的报错:
[Parsed_psnr_0 @ 000002161e3c6a40] Width and height of input videos must be same.
核心诱因是误用了-streamid参数:
-streamid是为输出流设置PID值的参数,没有筛选输入流PID的功能- 你的原命令并未选中两个输入里PID为3511的视频流,FFmpeg默认调用两个输入的第一个视频流做对比,恰好这两个流分辨率不一致,触发报错
正确操作方法
核心逻辑
用-map 输入序号:i:PID的语法筛选指定PID的输入流,再送入PSNR滤镜计算即可。
基础命令(确认两个目标流参数完全一致时使用)
.\ffmpeg.exe -i origin.ts -i ref.ts -map 0:i:3511 -map 1:i:3511 -lavfi "[0:v][1:v]psnr=stats_file=psnr_logfile.txt" -f null -
兼容命令(两个目标流参数存在差异时使用)
如果两个PID3511的流分辨率、帧率、时间基存在差异,可以先做参数对齐再计算:
.\ffmpeg.exe -i origin.ts -i ref.ts -map 0:i:3511 -map 1:i:3511 -lavfi "[0:v]settb=AVTB,fps=原始流实际帧率[base];[1:v]settb=AVTB,fps=原始流实际帧率,scale=w=base_w:h=base_h:flags=bicubic[ref];[base][ref]psnr=stats_file=psnr_logfile.txt" -f null -
参数说明
-map 0:i:3511:选中第一个输入文件中PID为3511的流settb=AVTB:统一两个流的时间基,避免时间戳错位导致帧匹配失败scale=w=base_w:h=base_h:将转码输出流的分辨率自动对齐到原始基准流的分辨率flags=bicubic:使用双三次缩放算法,降低缩放环节对PSNR计算结果的干扰
前置校验建议
可以先用ffprobe确认两个PID3511流的基础参数,避免无效计算:
ffprobe.exe -i 文件名.ts -show_entries stream=codec_type,width,height,r_frame_rate,pid -select_streams v -of compact=p=0
确认PID3511对应的流均为视频流即可。
内容的提问来源于stack exchange,提问作者Deim
相关产品推荐
相关产品推荐

