录播档时间戳(timestamp)损坏处理记录
DivideNull
2019年06月09日 05:34

视频处理的大佬们,这里是纯兴趣玩写个笔记

如导致写压升高、吐血等反应还请见谅

以为新参数录制B站完全没中断很成功 (录过都知道录B站没断简直是奇迹)

然后发现录播的时间戳(timestamp)损坏...(一开始以为硬盘???...但同时录的其它档是好的...)

全长2小时多(2GB+)的ts档,打开视频(VLC/LAV) / mediainfo都显示长度只有47分...

不是星际玩家应该都看得出来...视频大小和文件大小对不上

但用ffmpeg解码,刚开启视频的瞬间,把进度条拉到后半的话能看到后半内容

甚至还能调戏一下进度条

不过往前半跳的话就直接卡死了

使用ffmpeg直接copy,失败,只有前47~53分(这是已经试了好几种组合...)

疯狂跳出错误 Non-monotonous DTS in output stream

慌了

疯狂谷歌...爬了一大堆英文之后发现根本没有人完整讲过该怎么处理...

东拼西凑一大堆七零八落的情报不停尝试最后终于成功修复

虽然这可能不是最好的方法...但这是我摸出来可行的方法...

首先

由于视频的时间戳损坏 往ts/flv损坏修复去找

-copytb 1 没卵用

-vsync drop、-r 这两个不转码的话无效甚至报错

然后找到一个能无视旧有时间戳的参数

use_wallclock_as_timestamps 1

这个...是直接用系统时间计时当成时间轴...没错...(一般是实时抓流时用的)

copy执行的时间,将变成视频的时间轴...(5分钟的话那你视频时间轴就是变成5分钟...)

命令大概是

ffmpeg -use_wallclock_as_timestamps 1 -fflags +genpts i corrupted_input.ts -c:v copy -c:a copy OUTPUT.mp4

出来的档案,毫不意外时间轴是坏的(只有两分多)

由于2小时多被压缩到2分多

mediainfo看起来非常的欢乐...

147Mb/s的码率...帧率1656...最大帧率16000...

BUT!!!

原本只能读到8万多帧

现在全部(25万多帧)都读到了!!!

视频大小正常了,进度条也能拉动

fps/时间轴/声音,依然损坏

查到中途

发现不转码变更帧率的话将造成视频加速或减速

但这对我们来说刚好就是我们要的结果!!

透过恢复正常码率自然生成新的时间轴

使用MKVToolNix

加载刚刚生成的MP4

下方选择视频→右边设置FPS(本案例为30)

勾选修复位元串流时间资讯(不确定是不是必要)

(之后测试加载原始ts档用这个选项修复,时间轴正常,但47分后的视频依然无法观看)

输出的档案变成了

因为原本是可变帧率 强制锁定30丢失了超过的部份...但我看不出来

时间轴修复!!

视频可观看!!

只剩下...声音还是对不上...哈哈

但这对我来说已经简单了

因为不习惯用命令行

又另外用了一个工具 StaxRip

加载前一步生成的MKV后

会自动分离出音讯 (m4a)

之后就是把视频跟音讯重新包装输出

这个工具要设置不少东西...其它直接复制不转码的工具也行

成品

算是能正常播放了

然后

写这个的同时

我发现了一个问题

原来音讯也是有帧数的...(卧草...

但时长是正常的,应该也有对上....吧

算了

我特么又通宵了

反正没人看得出来...应该...

最后想了一下可能原因

因为怕B站抽风造成中断

hls-segment-timeout设了个30秒可能太过了...

其他想不出什么问题...

不行了

继续看团长跟贝尔+魔王了

24小时的VVD真特么好看