什么,你们刷的抖音视频,竟然用的编码方式是它!

时间:2024-01-23


周末了,经过一周的看书,读论文,写代码,那些晦涩的理论和难缠的bug真让人眼晕又头痛,我也起个"震惊体"的标题,放松一下。

不如今天来做个小实验,通过实例来探究一下,大家平时刷不停的抖音短视频里面,它的底层采用的是哪种视频压缩编码格式

先去抖音随便下载一段短视频,保存到本地。

可以看到这个短视频文件后缀是.mp4封装格式,但里面数据究竟是不是符合mp4格式,这个要用软件分析后才知道。

我先用VLC软件播放这段短视频,效果如下:

如果想查看一段封装格式(有视频画面也有音频)的视频的详细信息,可以用MediaInfo软件,如下图所示:

显然,我下载的抖音这段短视频,它的的视频编码方式是AVC,即H264。由于H.264/AVC标准是由ITU-T和ISO/IEC联合开发的,ITU-T叫H264,而ISO/IEC称它为MPEG-4 高级视频编码(Advanced Video Coding,AVC)。

视频分辨率是720x1280,因为是在手机上竖屏观看,所以这里的分辨率是高度大于宽度。

视频原始图像是YUV420格式。

最最重要的信息是,这段短视频压缩编码使用的是开源编码器x264

且x264设置的编码参数是:

cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=8 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=40 / lookahead_threads=6 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=50 / rc=crf / mbtree=1 / crf=24.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=4000 / vbv_bufsize=8000 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=1.40 / aq=1:1.00

没想到有这个视频里面保留有这么多编码参数信息,基本相当于开源编码器在裸奔了

那这些参数都是什么意思呢?具体大家可以使用x264软件的--fullhelp命令打印查看,为了方便起见,我将这个信息保存到txt文件,且上传到了:github.com/codec2021/vi

这里我挑几个重要的参数说明一下:

cabac=1表示x264编码时使用的是cabac熵编码而不是cavlc,因为H264标准里面是支持cabac和cavlc两种熵编码的,而H265里面只有cabac。

ref=5表示x264编码时设置的参考帧个数是5个。

me=hex表示x264编码时运动估计整像素搜索快速算法是六边形搜索。见:经典不过时之运动估计(HEX快速搜索篇)

8x8dct=1表示x264编码时变换块大小可以是4x4或者8x8,支持自适应。我们知道在x264里面默认变换块大小是4x4。

bframes=3表示x264编码时设置I帧和P帧之间的B帧个数是3(默认是3)。

rc=crf表示x264编码时码率控制使用的CRF模式,即Constant ratefactor。

mbtree=1表示x264编码时开启了时域AQ技术。

我们已经知道这个短视频里面视频压缩是H264,下面我们把H264的视频提取出来并解码看看。

可以用FFmpeg程序,把视频里面的视频流和音频流解析出来。直接用FFmpeg的命令行就可以做到。对于短视频里面音频编码格式AAC,今天就不细究了,我们主要来看视频内容。

编译好的Win平台的exe程序可以去下面的网址下载:

gyan.dev/ffmpeg/builds/#

FFmpeg从mp4里面抽取出H264裸流的命令行如下:

.\\ffmpeg.exe -i .\\c3495156e2474209e2c521bd1b422d70.mp4 -c:v copy -bsf:v h264_mp4toannexb -an .\\ffmpeg_1.h264

通常我们把解封装以后得视频流叫做裸流,即符合H264,H265,AV1等视频编码标准编码的码流。

通常视频解码过程,就是从压缩码流里面得到YUV视频图像的过程。

H264视频解码可以用FFmpeg,也可以用参考软件JM,或者可以用一些码流分析软件

使用FFmpeg解码这个H264码流得到YUV的命令行程序如下。这里有一个小技巧,我在生成YUV文件的时候,名字里面带上了它的分辨率信息,这样方便播放YUV时设置分辨率。

.\\ffmpeg.exe -i .\\ffmpeg_1.h264 -c:v rawvideo -pix_fmt yuv420p .\\ffmpeg_1_decode_720x1280.yuv

最终解码得到的YUV,使用YUV播放器打开的效果如下:

此外,使用第三方H264码流分析软件Elecard StreamEye Tools,可以分析关于这段短视频的H264码流更多信息,如下:

通过以上对选取这段抖音短视频的分析,可以明确,底层的视频编码方式还是用的发布于2003年距今已经快20年的H264/AVC标准,且使用的是开源H264软件编码器x264。

不知道读者里面有没有认识抖音做视频编解码的,请问一下他们难道没有自研的H264编码器吗?

服务支持

我们珍惜您每一次在线询盘,有问必答,用专业的态度,贴心的服务。

让您真正感受到我们的与众不同 !

合作流程

网站制作流程从提出需求到网站制作报价,再到网页制作,每一步都是规范和专业的。

常见问题

提供什么是网站定制?你们的报价如何?等网站建设常见问题。

售后保障

网站制作不难,难的是一如既往的热情服务及技术支持。我们知道:做网站就是做服务,就是做售后。

平台注册入口