FFMPEG视频编码的基础知识

这篇具有很好参考价值的文章主要介绍了FFMPEG视频编码的基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

抛砖引玉

首先我们先计算以下 1080P 60fps 的视频文件大小:

假设是RGB每色8位(也就是一个像素24位)

一帧画面像素数量:1920 * 1080  ~ 200万

一个像素: 3 字节

一帧画面 :  1920 * 1080 * 24(位像素)/8(1字节8位)/1024(1KB=1024B)/1024(1MB=1024KB)~ 5.9MB

一秒视频:    5.9MB * 60 = 355MB

通过上面可知一秒钟的视频应该是355MB,但实际我们看的视频并没有这么大,那是因为我们看的视频都是进行压缩之后的,实际大小只有1~2MB,那到底是如何实现的呢,我们后面慢慢讲解。

分辨率

就如上面所说,1080p是什么?下面这些又是什么?

 HD:1280x720

FullHD:1920x1080

2k:2560x1440

上面这些我们日常生活中应该都听过或者看到过,那这些都是什么?没错,这就是分辨率。

分辨率 = 横向像素*纵向像素。

我们经常会看见或听别人说 1920x1080 ,那么 1920x1080 就是分辨率,也就是横向1920个像素*纵向1080个像素。

是不是感觉很简单,那么下面一个问题,1080p是什么?你也许会说应该是 1920x1080的缩写吧,那么 1080i又是什么?看到这里是不是已经懵逼了,其实很简单

  • p:代表逐行扫描(Progressive Scanning)
  • i:代表隔行扫描(Interlace Scanning)

逐行扫描就是一行行扫描生成图像,一帧就是一个图像。

隔行扫描会将视频按照奇数扫描前一帧,然后再按照偶数扫描后一帧,最后将其合并就是一个完整的画面了。

隔行扫描相对于逐行扫描带宽会节省一半,也就是说同样的带宽可以获得更好的清晰度。

帧率

上面所说的 60fps 是什么?没错他就是帧率。

视频格式
封装格式

什么是封装格式?

他是一种容器,它规定了视频的外在,存储视频、音频、媒体信息及字母信息等,例如我们平时看见的 mp4mkvmov 这些就是封装格式。

编码格式

什么是编码格式?h264h265这些就是编码格式。常见的编码格式

 

MP4:H.264,H.265, MPEG4.. WebM VP8VP9... AVI:MPEG-2, AC-1, H.264, DIVX,XVID... RM/RMVB: RV, RM... MOV:MPEG-2, XVID, H.264... TSIPS:MPEG-2,H.264, MPEG-4.. WMy:WMV,AC-1.. MKV:可封装所有的视频编码格式

码率

平时转码视频时经常能看见 -b:v 5000Kbps,那么它究竟是什么呢?没错它就是视频码率(bitrate),音频码率使用 -a:v表示

码率:视频每一秒包含的数据量、信息量。码率直接决定了视频的最终大小及视频的质量。

控制码率的方法

CBR:固定码率,全程码率恒定,文件大小可预期,编码压力小,直播常用;简单场景画质好,复杂场景画质差;属于空间利用率最低的一种方法。

VBR:可变码率 ,码率可变,按需分配,简单场景码率低,复杂场景码率高。

CRF: 固定质量,固定质量模式 CRF值越低,视频看起来质量越高,反之亦然,以观感画质为目标码率、文件大小不可预期。

视频压缩

最开始我们说了,如果视频不压缩那么视频的体积就会特别大,无论是存储或者传输都会特别占用空间,那么通过视频压缩就是将原视频压缩至我们可以正常观看的视频大小了。但是视频压缩也会分为帧内压缩及帧间压缩。

帧内压缩(Intraframe compression)

帧内压缩:将视频的每一帧画面都压缩成JPEG这类有损图像,原理就是尽可能保存视频亮度信息,压缩颜色信息尤其是复杂的颜色信息,通俗来讲就是记录关键帧,剩余的依靠运动轨迹来预测生成视频。可以节省90%的空间。

帧内压缩就是压缩 GOP 图像组中的 I 帧。

帧间压缩(Interframe compression)

帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的;通过比较时间轴上不同帧之间的数据实施压缩,进一步提高压缩比。

帧内压缩就是压缩 GOP 图像组中的 B 帧与 P 帧。

GOP(Group Of Picture)

画面组,每一组IPB顺的序列包含多少顿,即一个I帧之后要经过多少帧会出现下一个帧。

同码率下,GOP值越大代表模拟出的P、B帧越多,那么视频就越清晰,画面质量就越高。

I帧

关键帧。不参考其他图像帧,只利用本帧的信息进行编码

P帧

预测帧,表示跟前一帧的差别,在I帧的基础上预测得出,比I帧节省一半的空间。利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码。

B帧

双向预测帧,表示前后帧差别,在 I帧P帧的基础上再次进行预测。比 P帧又节省了一半的空间,提供最高的压缩比,它既需要之前的图 像帧(I帧或P帧),也需要后来的图像帧(P帧),采用运动预测的方式进行帧间双向预测编码

h264编码方式

我们常见的mp4就是h264编码的。

Preset(预设)
  • Faster 超低
  • Fast 低
  • Medium 中
  • Slow 高
  • Very Slow 超高
cpu编码及GPU编码

使用cpu编码的视频质量要高于GPU的视频质量,但是速度想读与GPU要慢很多。

示例和方法

码率和视频体积之间的关系

视频和音频码率计算公式:

  • 视频码率计算公式(kbps,千位每秒) = 文件大小(KB,千字节)* 8 / 秒数
  • 音频码率计算公式(kbps,千位每秒) = 采样率 × 采样位深 × 通道数

比特率又叫码率,比特率全称是bit,单位是b,用来表示每秒初始的字节数,单位是 kbps (注意是小写的 k )

  • K 字节数
  • b 比特(bit)
  • p 每(per)
  • s 秒(secend)

一般用Kbps表示(即千位比特率,K=千位,b=比特率,p=per每,s=second秒,意思就是:每秒传送多少千位比特率)

比特率和字节之间的计算公式,可以通俗的把比特率理解为代表速度,字节代表体积,一字节有8位比特率,字节全称是Byte,单位是B,即1B=8b。

举个例子:现在我有一个音视频文件,时长4分钟,码率是512Kbps,求这个文件的体积,公式:4*60*(512÷8)=15360KB(这个音视频文件有15MB),为什么512要÷8,因为8个码率是1个字节,我们是求体积所以需要÷。

比特率又一个粗略的计算公式: 文件大小/时长

比如一个文件大为 12MB,时长为 88秒,那么按照粗略计算公式,比特率大概为:

(12 * 1024 * 8) / 88 =  1117.09 kbps

 

计算文件Size

计算视频流Size的公式如下所示:

//码率*时间/8得出来的时间单位是bytes
video_size = video_bitrate * time_in_second / 8

计算音频流Size的公式如下所示:

//如果音频没有经过压缩计算公式如下
audio_size = sampling_rate * bit_depth * channels * time_in_seconds/8;

//如果音频流经过压缩了计算公式如下
audio_size = bitrate * time_in_seconds / 8

下面以一个时长为10分钟,视频码率为1400k/s音频码率为128k的视频文件为例说明一下计算公式的使用方法

//1byte = 8bits
file_size = video_size + audio_size
file_size = (video_bitrate + audio_bitrate) * time_in_seconds / 8
file_size = (1500 kbit/s + 128 kbits/s) * 600 s
file_size = 1628 kbit/s * 600 s
file_size = 976800 kb = 976800000 b / 8 = 122100000 B / 1024 = 119238.28125 KB
file_size = 119238.28125 KB / 1024 = 116.443634033203125 MB ≈ 116.44 MB

实际的文件大小可能要比计算的文件大小大一些,因为其中包含了一些打包数据和视频文件的元数据。文章来源地址https://www.toymoban.com/news/detail-604089.html

到了这里,关于FFMPEG视频编码的基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 FFMPEG 的跨平台视频播放器简明教程(二):基础知识和解封装(demux)

    基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 前面一章中我们介绍了如何使用 conan 和 cmake 搭建 ffmpeg 运行环境,你做的还顺利吗?如果遇到任何问题,请在进行评论,我看到都会回复的。 从本章开始,将正式开始我们的 ffmpeg 播放器学习之旅。接下去

    2024年02月08日
    浏览(162)
  • 【音视频处理】转编码H264 to H265,FFmpeg,代码分享讲解

    大家好,欢迎来到停止重构的频道。 本期我们讨论音视频文件 转编码 ,如将视频H264转H265等。 内容中所提及的 代码都会放在GitHub ,感兴趣的小伙伴可以到GitHub下载。 我们按这样的顺序展开讨论:​ 1、  编码的作用  2、  转编码的工作原理 3、  编解码器安装  4、  示

    2024年02月11日
    浏览(49)
  • 【ffmpeg基础】ffmpeg视频编码

    通过-s来指定输入yuv的分辨率(需要先指定分辨率); 通过-pix_fmt来指定输入yuv的像素格式; 通过-i来指定输入yuv的路径和名称; 通过-r 来指定要编码的帧率; 通过-vcodec来指定视频编码的编码器为libx264 通过-an参数来去掉输入input.mp4中的音频,并通过-vcodec libx264将输入的视频进

    2024年02月14日
    浏览(35)
  • FFmpeg源码分析:avcodec_send_frame()和avcodec_receive_packet()音视频编码

    FFmpeg在libavcodec模块,旧版本提供avcodec_encode_video2()作为视频编码函数,avcodec_encode_audio2()作为音频编码函数。在FFmpeg 3.1版本新增avcodec_send_frame()与avcodec_receive_packet()作为音视频编码函数。后来,在3.4版本把avcodec_encode_video2()和avcodec_encode_audio2()标记为过时API。 在上一篇文章介绍

    2023年04月11日
    浏览(36)
  • 音视频学习之ffmpeg常用基础命令整理

    基于windows环境安装好必要的ffmpeg后,对ffmpeg基础命令进行一些了解:   有时候写入MP4文件会不成功,改成flv就好 1:视频裁剪:   2:文字水印: 编译的时候需要支持 FreeType、FontConfig、iconv,系统中需要有相关的子库, 在 FFmpeg 中增加纯字母水印可以使用 drawtext 滤镜进行支持

    2024年02月12日
    浏览(49)
  • ffmpeg 基础知识

    流 (stream):通常的视频文件中最易见的是视频流与音频流两个流。部分视频文件(多为 mkv 文件)还有字幕流,即内挂字幕。注意,有的视频将字幕嵌入到了视频流中(内嵌字幕),这类视频没有字幕流,也无法提取出字幕文件。 码率/比特率 (bitrate):衡量流的数据量的

    2024年01月18日
    浏览(24)
  • 【音视频处理】基础框架介绍,FFmpeg、GStreamer、OpenCV、OpenGL

    大家好,欢迎来到停止重构的频道。  本期我们介绍 音视频处理的基础框架 。 包括FFmpeg、GStreamer、OpenCV、OpenGL 。 我们按这样的分类介绍 : 1、编解码处理:FFmpeg、GStreamer 2、图像分析:OpenCV 3、复杂图像生成:OpenGL 首先是编解码处理的基础框架,这类基础框架的 应用场景

    2024年02月08日
    浏览(48)
  • 音视频之旅 - 基础知识

    像素 像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。在下面这张图中,你可以看到一个个方块,这些方块就是像素 分辨率 图像(或视频)的分辨率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如说一张1920x1

    2024年02月04日
    浏览(42)
  • Java如何整合FFmpeg、FFprobe等音视频处理工具,零基础照样玩

    最后奉上工具的学习资料(感兴趣的可以看看),废话不多说!!!!! FFmpeg是啥 :​ ffmpeg(命令行工具) 是一个快速的音视频转换工具。 FFmpeg能干啥 :如果你用过爱剪辑的话或者其他一些音视频处理软件的话,你可以理解他们能做的你用玩意都能做。 为啥要用FFmpeg :开源

    2024年02月02日
    浏览(70)
  • Android中集成FFmpeg及NDK基础知识

    在日常App开发中,难免有些功能是需要借助NDK来完成的,比如现在常见的音视频处理等,今天就以ffmpeg入手,来学习下Android NDK开发的套路. 很多人并不清除JNI和NDK的概念,经常搞混这两样东西,先来看看它们各自的定义吧. 很多人并不清除JNI和NDK的概念,经常搞混这两样东西,先来看看

    2024年01月17日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包