@
1054850490 #10 细节处理肯定不会通用的,但正确的思路、模式是能够泛用的。我实践了一下,发现还是卓有成效的,但并不是每个有问题的视频都会输出类似的错误日志、都会输出相同的关键词,需要针对不同类型的损坏添加特征集,一遍一遍地筛查。但毫无疑问,这个过程肯定是自动化的,是比人工快得多的。
首先作为演示,我们需要一个视频作为对照组,为表诚意,当然得选择“同类型”的视频啦,好在我的收藏里是有这类视频的,虽然只有唯一一个:
[직캠_Fancam] 150520 밤비노(BAMBINO) (은솔) 댄스공연 Intro @ 건양대 [nljhfXCcXlE][pharkil 2015].mp4
https://anonfiles.com/D262Hc6dy4/_Fancam_150520_BAMBINO_Intro_nljhfXCcXlE_pharkil_2015_mp4那么,先用`ffplay -i filename`来播放它,好的,播放正常,播放过程中可以左右 seek 跳转快进快退,都没问题。不过在播放到结尾的时候,画面并没有消失,ffplay 程序也没有退出,底部状态那一行还在飞速变化,我们看看它显示的什么:
91.23 A-V: -7.910 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
91.23 是当前播放位置,其实已经是视频结束了,这个视频就这么长,所以这个数值尽管在跳动,但其实不变了。
A-V 这个数值,看字面意思,莫非是音频轨和视频轨之间的差值?好像是这样的,播放过程中,这个值是一个在 0 附近跳动的微小数值,体现了音画之间的同步差值。但等到播放结束之后,音频肯定停了,但画面还在跑(虽然只有黑屏),于是这个值开始在负轴上一路狂奔,朝着负无穷勇往直前。
这个时候,如果再按右键进行快进,那么自然是“异常”的,虽然程序不会退出,但是会打印红色的错误信息“error while seeking”,嘛,说得通,毕竟后面已经没了,播放结束了。
那么,如果是加速播放呢,用命令`ffplay -i filename -vf "setpts=0.1*PTS"`,跟刚才差不多。唯一不同是,播放过程之中,A-V 就开始往负轴跑,毕竟音画不同步了,这个命令只调快了画面。顺便,setpts=0.1*PTS 按理来说应该是 10 倍速播放,但结果显然不是,只有 2 倍多一点,我不知道为什么,先不管。
那么,如果换用 ffmpeg 转码呢,自然也是没问题的,因为这个视频本身没问题嘛,所以转码过程没任何不良消息。顺便一提,我这台笔记本显卡是 RTX 3050 Ti ,30 系显卡的硬件转码真的是又好又快啊,我用 ffmpeg 自带的 nvenc 编码器,转码倍速能到 20x ,即使不缩小输出画面尺寸也能有 18x 。
好了,对照组完毕,现在来看看实验组样品。
220708 #뮤직뱅크 퇴근길 #비비지 #VIVIZ (#은하 #신비 #엄지) Fancam-宽度 1920-码率 4445.735-编码 avc1.640028-频道名(전람회)-网页地址 olOzlESoEh0.[origin].mkv
出门口的这个视频。
这个视频问题明显,所以输出日志中的错误消息也很明显,一大串的类似下面截取的消息:
[NULL @ 000002e318718d40] missing picture in access unit with size 276
[h264 @ 000002e318771000] Invalid NAL unit size (0 > 5688).
[h264 @ 000002e318771000] Error splitting the input into NAL units.
[NULL @ 000002e318718d40] Invalid NAL unit size (0 > 36089).
[NULL @ 000002e318718d40] missing picture in access unit with size 36093
[h264 @ 000002e3187aec00] Invalid NAL unit size (0 > 7954).
[h264 @ 000002e3187aec00] Error splitting the input into NAL units.
[NULL @ 000002e318718d40] Invalid NAL unit size (0 > 5930).
[NULL @ 000002e318718d40] missing picture in access unit with size 5934
[h264 @ 000002e3187af0c0] Invalid NAL unit size (0 > 21100).
[h264 @ 000002e3187af0c0] Error splitting the input into NAL units.
[NULL @ 000002e318718d40] Invalid NAL unit size (0 > 19469).
[NULL @ 000002e318718d40] missing picture in access unit with size 19473
真的是一大串,不停地刷屏。你看,这种特征明显,关键字固定的错误最好找了对不对? ffplay 和 ffmpeg 跑都是这样的错误,好了,这个类型的损坏视频算是搞定了。
우주소녀 루다 부탁해-宽度 720-码率 897.992-编码 vp9-频道名(지구젤리)-网页地址 flh-q3MpgVg.[origin].mkv
舞台上白色短裙的这个视频。
这个视频特征不明显。ffmpeg 转码(目标容器格式维持原格式,mkv )的时候,一共蹦出来三行警告:
[matroska @ 000001745e3eae40] Invalid DTS: 15100 PTS: 10133 in output stream 0:0, replacing by guess
[matroska @ 000001745e3eae40] Invalid DTS: 25233 PTS: 17700 in output stream 0:0, replacing by guess
[matroska @ 000001745e3eae40] Invalid DTS: 45500 PTS: 35267 in output stream 0:0, replacing by guess
但如果转成 mp4 的话,则完全没提示任何错误警告,仿佛没事一样。
那么如果用 ffplay 来播放呢,也没输出错误警告。
好吧,这种缺帧的视频我们就认怂换个思路,老老实实比对实际帧数和理论帧数吧。