短文。快速描述一下前文成文之后的一些变动。
直接concat HLS切片产生的TS用ffmpeg重封装后的视频,使用内置解码器播放拖进度条会卡顿
这个是最离奇的问题,而且我觉得99%的人都不会遇到,但是还是描述一下。这个问题和 PotPlayer 更新无关,因为用23年的旧版本也会复现。但是我只是在最近才注意到这个问题,因此我只能怀疑是显卡驱动什么的触发了这个bug了。
首先Pot复现需要的设置:只要用Pot全默认就好,或者更具体说只要使用内置的AVC解码器就会出现。如果用硬解,则更为明显。
出现问题的片源:这个则比较复杂。简单来说,就是对于HLS下载的ts切片,通过 binary concatenation 的方式合并(也是我最常用的方式),然后再用 ffmpeg 转一遍MP4或者MKV之后的文件。我经常这样处理我下载的 livestream,因为直接合并出来的TS文件本身播放时经常有奇怪的bug,转一遍mp4解千愁,连拖动进度条都会顺畅许多。其实mkv更好,但是mkv由于有时间戳精度的问题毫无意义的完美主义比较抗拒。其中许多视频由于HLS切片的方式,本身就有各种时间戳(TS)的问题,转换时ffmpeg会抱怨诸如:
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=3060, dts=9000, size=148
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=9000, dts=11970, size=113
[vost#0:0/copy @ 000002a34f474ac0] Invalid DTS: 9000 PTS: 3060, replacing by guess
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=15030, dts=20970, size=116
[vost#0:0/copy @ 000002a34f474ac0] Invalid DTS: 11970 PTS: 9000, replacing by guess
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=20970, dts=23940, size=106
[vost#0:0/copy @ 000002a34f474ac0] Invalid DTS: 20970 PTS: 15030, replacing by guess
[vost#0:0/copy @ 000002a34f474ac0] Invalid DTS: 23940 PTS: 20970, replacing by guess
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=27000, dts=32940, size=114
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=33030, dts=36000, size=122
[vost#0:0/copy @ 000002a34f474ac0] Invalid DTS: 32940 PTS: 27000, replacing by guess
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=39060, dts=45000, size=115
[vost#0:0/copy @ 000002a34f474ac0] Invalid DTS: 36000 PTS: 33030, replacing by guess
[mpegts @ 000002a34ea91500] Invalid timestamps stream=1, pts=45000, dts=47970, size=113
[vost#0:0/copy @ 000002a34f474ac0] Invalid DTS: 45000 PTS: 39060, replacing by guess
云云。转换出来的文件自然也会有dts/pts不太连续的问题:

可以看到,这个文件不但PTS不连续,甚至会有重复的 packets;比如0.066秒就有两个。片源(eplus streaming+)估计切片的方式有点不标准,切割点前后估计有重复的数据包。事实上,如果用 mkvmerge transmux 一次,体积可以缩小27%!
但是正常来说,即使是这样的文件,也不是不影响正常播放的。
但是这次的问题恰恰就出在这样的文件:如果用Pot播放并快速地在进度条上seek,会发现每次seek完(关键帧seek)的前100毫秒左右播放时会出现卡顿、慢动作、快动作等反常现象。
另外注意制作测试视频时,只要使用 ffmpeg -c copy,不管是输出mp4还是mkv都会有问题。但是原始的.ts反而不会,或者ffmpeg输出也是.ts也不会。用 mkvmerge 输出 mkv 也不会。
如果改解码器为LAV,或者使用内置,但是修改为这个“System MFT Decoder”:

此BUG都会消失。而且这个bug只有在片源比较长(比如2hr+)的时候才会很明显,从中间切十几分钟几乎感知不出来,所以也很难做一个最小重现的示例片源。
但是这个“System MFT Decoder”又会有一个其他的bug,就是之前 Pot 其实一直会有的,播放TS封装的H.264/Main时,会导致视频比例显示不对(1920x1080p的视频显示为1920×1084)。这个BUG在用默认的Built-in FFMPEG Decoder的时候已经修复,但是看上去没有修复几乎没有人用的System MFT Decoder的情况。
为了规避这个bug,我现在又全盘换成了LAV解码器了(参见上文LAV方案的2)。
但是用LAV解码器通到Pot,并且使用D3D11渲染器时,又有个另外的BUG:就是对于没有色彩信息bitstream tag的视频(也就是用mediainfo查看信息,看不到诸如“Color range : Limited”这样的信息的),在240305版本后,会默认被视为PC range(然而实际上99%的情况都是Limited range的),导致显示变灰。关于这个问题,我几个月前已经发邮件给作者了,但是他坚称这不是bug,而且“don’t comment any further on this matter, and if you think current is problem, just use another program”。我也是很无语,那如果要用LAV的时候,请改回使用EVR渲染器(或者默认的auto)吧。
Pot最新版使用D3D11解码+D3D11渲染10bit视频时又没有dithering了
之前说过 PotPlayer 使用 D3D11 硬解码 + D3D11 渲染器时,虽然依然有发绿的 bug,但是至少 10to8 是有 dither 的。
然而我在 231220 到 240509 这两个版本之间,PotPlayer 不知道修改了什么,导致这个 dither 没有了,于是瞬间有了巨明显的 banding 问题:


请看这个对比。左边是 231220 版本,右边是最新的 240827。图片经过对比度增强。可以看到人嘴附近,从之前的几乎看不到 banding 变成了非常明显的 banding。
对比两者的 OSD,可以看到区别在于之前的 BackBuffer 这一层是工作在BGRA,也就是说已经进行了有 dither 的10to8才到 BackBuffer;现在则是 RGB10A2。也就是说 10to8 的步骤发生在了这后面的BackBuffer 到 Display 之间;而这一步是没有 dither 的(也符合上一文的分析)。其具体原理我就说不清楚了,因为我根本不知道 BackBuffer 是个什么东西。
我不知道为什么会有这样的改动。介于开发作者回邮件的态度我也不是很想给他再写信了,反正我个人也不用这个组合。
顺便贴一下从我测试的最早的 bad 版本 240509 到最后一个 good 版本之间的 changelog:
[240509]
----------------------------------------------------------
- Fixed an issue where the screen did not appear when playing some MP4 files
- Improved built-in D3D9 renderer stability
- Fixed an issue where files in compressed files could not be played properly
- Fixed an issue where the screen was broken after navigation when playing certain MPEG 2 with DXVA
----------------------------------------------------------
[240305]
----------------------------------------------------------
+ Added NVIDIA RTX Video HDR function
+ Added ability to move files to playlist
- Fixed an issue where damaged WAV files could not be played
- Fixed an issue where the screen was broken when playing certain MPEG4 codecs
- Fixed an issue where the screen did not appear when playing certain WMV videos
- Fixed an issue where certain SRT protocols did not work
- Fixed an issue where an error occurred when playing certain TS files
- Fixed an issue where an error occurred in certain situations when playing some VP8/9 codecs.
nVidia 修复了缩放糊的BUG
上文提过最离大谱的是 nV D3D11 video processer 缩放的 bug,更具体地说就是如果缩小到小于原始大小50%(长度比?)时会出现整个画面完全糊掉重影的现象。
果然这么过分的 bug 还是相对比较快地修复了。在 nV 驱动 560.70 的 changelog 中,有这么一条:
- [OBS] Scaling 10-bit HVEC or AV1 content down below 50% in viewport shows corruption for some configurations [4496901]
说的就是这个bug啦。
























































