如何用 ffmpeg 找到损坏的视频 50 块钱悬赏答案 - V2EX
1054850490
·
2022-09-01
·
via FFmpeg
 |
|
18
acreti 2022 年 9 月 5 日
@1054850490 原本多少帧,要对比完好无损的原视频。类似于一把梳子,缺了几个针,但基座还在,就是丢帧。帧数量不记录,帧数 FPS 会记录。没有帧错误这么一说,解码 B 帧时要参考后面的帧,但后面的时间戳上没有对应的视频帧,所以解码到此处时出现画面错误,既然后面时间戳上没有视频帧,就会一直显示这个错误画面。不太会解释,不知道你看懂了没有,可以先 Google 一下 I 、P 、B 帧是什么。
|
 |
|
20
ungrown 2022 年 9 月 5 日
@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 来播放呢,也没输出错误警告。 好吧,这种缺帧的视频我们就认怂换个思路,老老实实比对实际帧数和理论帧数吧。
|
 |
|
29
1054850490 2022 年 9 月 8 日
@ungrown 这倒是,但是还有很多只是缺少 3 帧左右的,一般一个 m3u8 也不止这几帧,我还很纳闷这到底是怎么丢的, 我现在是用 yt-dlp+arid2+ffmpeg 合成来下载的,至于损坏视频是近些时间才发现的,但是用了上面老兄的方法排除的视频,我发现从年初开始就有了,六月初进行了一次系统重装,ffmpeg 又更新到最新版本了,但是六月之后也出现了损坏视频的情况,我还是得发帖到 yt-dlp 社区看看有没有人类似的情况
|
 |
|
30
ungrown 2022 年 9 月 9 日
@1054850490 #29 我没有用 yt-dlp ,我用的 youtube-dl ,我其实有点想用 dlp 的,但是我已经在原版的基础上魔改了几个提取器的 class ,比如 iwara 的,我又严重依赖这些改动,用着又没啥毛病,我又懒,所以我就没换 dlp 。 我的 youtube-dl 的配置文件: --cookies ~/.config/youtube-dl/cookies.youtube.txt -o "%(title)s [%(extractor)s %(id)s][%(uploader)s].%(ext)s" --yes-playlist --fragment-retries infinite -icw --external-downloader aria2c --external-downloader-args "-x10 -s10 -k 1M" -f (299/137)[height<=?1080][fps<=60]+(m4a/aac)/bestvideo+bestaudio/best #--socket-timeout 30 #-R infinite 我用自己写的 tg bot 辅助下载,把 url 往 bot 聊天里面一扔就不管了,所以那一大堆下载的视频我并没有挨个仔细检查过。但就我确实打开观看过的那些视频来说,我没有发现肉眼可见的损坏,也许也少了几帧,那这种我肯定是不在乎的。 然后我从油管下载的时候,从来没走过 hls 协议,没看到 m3u8 相关的信息,基本全是 dash mp4 流,一个视频流一个音频流,全是 aria2c 下载的,可能跟我限定了媒体格式有关,就是这行配置`-f (299/137)[height<=?1080][fps<=60]+(m4a/aac)/bestvideo+bestaudio/best`。 从 p 站下的视频倒是经常走 hls ,然后偏偏 aria2 不支持 hls 嘛,然后它就分段下载,哎哟我去那个龟速我就日了,前几天我刚刚研究了这个事情,给 p 站 url 开了一个处理分支加了一点参数,`-f [format_id!*=hls]`,把带 hls 标记的媒体流给排除掉了,终于又可以通过 aria2c 秒速下载了。 hls 真的是坏东西,对下载而言,我个人觉得。
|
 |
|
31
1054850490 2022 年 10 月 13 日
@ungrown 我算是研究清楚了,我那个视频损坏常发生于磁盘满的情况下,因为 arin2 是分段下载,不是 ts ,是私有的后缀,列如这里有 1 、2 、3 、4 、5 ,五个片段,aria2 下载完成了其中的 1245 ,虽然 3 也创建了,但是因为中间磁盘满了,下载并不完全,但是依旧发生了合成,就会出现中间缺少帧数的情况,如同下图中的情况 
中间缺失的就是因为下载过程中下载不完全,却依旧发生了合成导致的结果,我目前还在开着日志尝试捕捉更多信息,但是目前也不知道怎么会发生合成的,我不知道你了不了解 m3u8 ,我不知道如果其中一个 ts ,直接用一个“毫无意义”的程序,比如用一个 exe 程序,改名为其中一个 ts 片段不知道会不会依旧合成
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。