ffmpeg添加动态时间戳的问题

ffmpeg添加动态时间戳的问题,第1张

最近项目有个需求——给录制的视频按照基准时间添加动态掘改时间戳。

看到这个需求,第一个想到的就是用ffmpeg去转换,百度了一番,基本上都是类似与下面这条命令:

ffmpeg -i 20201124023926196.mp4 -vf "drawtext=expansion=strftime:basetime=$(date +%s -d '2020-11-24 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=18:fontcolor=white:box=1:x=100:y=100:[email protected]:" -strict -2 -y out.mp4

执行后,可以发现时间戳并不是银散腊从指定的"2020-11-24 16:27:50"基准时间开始的,这是什么原因呢?于是又从git上查找相关的资料,发现是basetime格式的问题, basetime是int(64)类型的,精确到微秒, 一定要注意这一点。

其它参数说明:

       -i: 指定输入文件,这里使用的视频编码是H264, 音频编码是AAC

-vf: 视频滤镜,使用了drawtext滤镜,basetime是视频时间戳的初始值,text是显示时间的格式,fontsize后面一串是关于水印的颜色、字体、背景等设置

-strict -2:AAC的解码在2.x版本是试验性功能,需要加这个参数

锋滑-y: 覆盖已经存在的输出文件

(1)图像冗余信息:空间冗余、时间冗余

(2)视频编码关键点:压缩比、算法复杂度、还原度

(3)H.264的2大组成部分:视频编码层VCL和网络抽象层面NAL Network Abstract Layer,

(1)宏块 MB macroblock

(2)片 slice

(3)帧 frame

(4)I帧、B帧、P帧

(5)帧率 fps

(6)像素->宏块->片->帧->序列->码流

我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。

H264更深层次 —》宏块 太浅了

如果单纯的用宏快来发送数据是杂乱无章的,就好像在没有集装箱 出现之前,货物总是随意被堆放到船上。

上货(编码),下货是非常痛苦的。 当集装箱出现之后,一切都发生了改变,传输效率大大增高。

集装箱可以理解成H264编码标准,他制定了相互传输的格式,将宏快 有组织,有结构,有顺序的形成一系列的码流。这种码流既可 通过 InputStream 网络流的数据进行传输,也可以封装成一个文件进行保存

H264: H264/AVC是广泛采用的一种编码方式 。 主要作用是为了传唯饥输

组成H264码流的结构中 包含以下几部分 ,从大到小排序依次是

NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆神改包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。

VCL层:(Video Coding Layer,视频数据编码层): 对视频原始数据进行压缩

H264是一种码流 类似与一种不见头,也不见尾的一条河流。如何从和流中取到自己想要的数据呢,

在H264的标砖中有这样的一个封装格式叫做"Annex-B"的字节流格式。 它是H264编码的主要字节流格式。

几乎市面上的编码器是以这种格式进行输出的。起始码0x 00 00 00 01 或者 0x 00 00 01 作为分隔符。

两个 0x 00 00 00 01之间的字节数据 是表示一个NAL Unit

切片头:包含了一组片的信息,比如片的数量,顺序等等

H264中,以16x16的宏块为编码最小单元,一个宏块可以被分成多个4x4或8x8的块

同一个宏块内,像素的相似程度会比较高,若16x16的宏块中,像素相差较大,那么就需要继续细分

当然,像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显著提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽更小。

不合理的分块会出现块效应,即块与块之间色差明显

海思在3559之后有deblock的接口可以应对块效应,3519上用的很多

在I帧中,全部宏块都采用帧内预测的方式,所以解码时仅用I帧的数据就可重构完整图像,不须要参考其余画面而生成。web

H.264中规定了两种类型的I帧:普通I帧(normal Iframes)和IDR帧(InstantaneousDecoding Refresh, 即时解码刷新)。 IDR帧实质也是I帧,使用帧内预测。IDR帧的做用是当即刷新,会致使DPB(Decoded Picture Buffer参考帧列表)清空,而I帧不会。因此IDR帧承担了随机访问功能,一个新游山判的IDR帧开始,能够从新算一个新的Gop开始编码,播放器永远能够从一个IDR帧播放,由于在它以后没有任何帧引用以前的帧。若是一个视频中没有IDR帧,这个视频是不能随机访问的。全部位于IDR帧后的B帧和P帧都不能参考IDR帧之前的帧,而普通I帧后的B帧和P帧仍然能够参考I帧以前的其余帧。IDR帧阻断了偏差的积累,而I帧并无阻断偏差的积累。算法

一个GOP序列的第一个图像叫作 IDR 图像(当即刷新图像),IDR 图像都是 I 帧图像,但I帧不必定都是IDR帧,只有GOP序列的第1个I帧是IDR帧。缓存

疑问:按照GOP、IDR帧、I帧的解释,若是一个GOP出现除去第一个IDR帧以外的I帧,是不存在的,那这样的话,就不存在非IDR的I帧了,但是为何还要说明非IDR的I帧呢。svg

解答:H264编码存在多种编码方式CBR、VBR、CVBR、ABR等等,VBR编码模式下图像内容变化差别很大时,会动态调整I帧的数量,所以GOP的概念须要修正:两个IDR帧之间的间隔为一组GOP,一组GOP中能够出现非IDR的I帧。编码

P帧:前向预测编码帧。P帧表示的是这一帧跟以前的一个关键帧(或P帧)的差异,解码时须要用以前缓存的画面叠加上本帧定义的差异,生成最终画面,P帧没有完整画面数据,只有与前一帧的画面差别的数据。P帧的压缩率20code

B帧:双向预测内插编码帧。B帧是双向差异帧,也就是B帧记录的是本帧与先后帧的差异,要解码B帧,不只要取得以前的缓存画面,还要解码以后的画面,经过先后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,约为50,可是解码时CPU会比较累。orm

通常能够输出H264帧的USB摄像头,使用的是BP-Baseline Profile,只有I帧与P帧。视频

而slice呢,也是对宏块的划分

本文简单叙述了;音视频中的H264编码中的,宏块、帧、片。音视频还有更深入的学习,知识范围很广,需要一套很详细的学习资料与路线。我推荐上面的一套入门到精通资料辅佐。

H264解析slice就可以找到帧,可以从帧信息中获得DTS时间,从sps信息中获得PTS时间

AAC解析郑漏陆frame,根据AAC编码码率信息,可以知道每一个frame的时间增量,获喊顷得PTS时间搜前


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11985712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存