‘壹’ 【FFmpeg实战】视频压缩标准之 H.261/H.262/H.263/H.264/H.265
H.261,1990年由国际电信联盟电信标准化部门(ITU-T)制定的视频编码标准,是首个实用的数字视频编码标准。H.261的成功设计成为后续视频编码国际标准的基础,包括MPEG-1、MPEG-2/H.262、H.263,乃至H.264。
H.262,1994年完成,与ISO/IEC的MPEG-2视频标准一致。H.262与ISO/IEC组织联合制定,分别成为两个组织的标准。H.262广泛应用于DVD技术。
H.263,1995年ITU-T制定,用于低比特率压缩格式,性能显着提高。H.263有三个版本:第一版1995年完成,第二版1998年增加了新功能,第三版2000年完成。H.263主要应用于互联网应用、多媒体消息和视频会议。
H.264,2001年ITU-T和ISO联合制定,实现高压缩比、高图像质量和良好网络适应性。成为高精度视频录制、压缩和发布的最常用格式之一。广泛应用于网络流媒体、高清电视等领域,相较于H.263,H.264的压缩效率更高。
H.265,被视为H.264/MPEG-4 AVC的继任者。2004年开始制定,2013年成为国际电信联盟正式标准。H.265能提供H.264两倍的压缩率,支持4K甚至8K清晰度,但使用成本较高。
总结,H.261至H.265的效率依次提升,H.261和H.263被认为过时,H.264是当前最广泛使用的格式,而H.265使用成本相对较高。
原文链接:juejin.cn/post/69960958...
音视频开发视频教程:ke.qq.com/course/320213...
音视频开发学习资料、教学视频,免费分享有需要的可以自行添加学习交流群:739729163 领取
‘贰’ ffmpeg压缩视频教程-视频如何压缩不会损坏画质
如何在linux环境下使用ffmpeg压缩视屏格式转换(将转换成)C代码
#ffmpeg-i
-i表示输入文件
:现在有个,有个音频3,将其合并成
两个命令(是中间文件,用完可删)
C代码
#ffmpeg-i-vcodec-an
#ffmpeg-i-i3-vcodec-acodec
-i表示输入文件
-vcodec表示forcevideocodec(‘’tostream)这个不知怎么译,估计是直接
-acodec这个说的应该是音频了跟上面一样
-an:表示disableaudio估计是audiono之类的缩写,表示去掉原有的音频
怎么压缩视频且不破坏分辨率?可以使用
爱剪辑
软件来将视频文件压缩且不破坏分辨率,步骤如下:
需要工具:电脑、爱剪辑软件
一、首先找到需要压缩的视频,并将其拖到桌面上方便查找,此时视频大小为66.6M。
二、然后打开“爱剪辑”视频编辑软件(没有可搜索下载),安装完成鼠标左键双击软件。
三、双击鼠标左键进入软件界面,这个时候点击“添加视频”,将要压缩的视频添加进来。
四、由于之前已经将文件放于桌面上,这时候直接从桌面添加视频即可(鼠标左键双击打开)。
五、添加视频进入后,会弹出窗口有视频的大致参数:视频时间、格式等,这里直接确定。
六、确定后,在界面右方可以看到有“导出视频”按钮,直接左键单击。
七、弹出窗口,可以设置需要导出的
视频格式
、大小、名称等,即选择合适的参数来导出视频。
八、可以看到,视频由原来的66.6M缩减为23.8M了。
视频如何压缩不会损坏画质?不能完全无损,完全无损的说法不是打广告就是骗人的,我们都知道压缩视频获取压缩文件,是对代码优化缩小,或多或少会影响视频的清晰度(画质)。减少对视频画质的影响,在压缩时我们将分辨率相应的在原视频分辨率上上调一点就相当于告诉压缩工具,要保存设置的分辨率来压缩视频,视频压缩之后的画质与原视频文件相差不大。
1、打开工具时双击工具,点击打开在页面上会出现三个功能选项。
2、点击选择“视频压缩”我们点击到视频压缩界面在这里添加我们要压缩的文件,添加一个短视频到页面中。
3、由于视频的添加页面山多个会出现辨识度的值,点击这个方框我们自由调整分辨率。
4、压缩点击页面右边的按钮“开始压缩”,这个键点击之后就会压缩,视频上回出现压缩流程条。
5、压缩流程条显示完成代表视频文件已经压缩,视频压缩的越小对视频的影响相对较大,在视频压缩上我们通常都是普通压缩即可,
这样保存视频的状态是原格式不用解压可以打开使用;
对视频的压缩在添加是我们也可以选择多个视频同时执行这样的操作,当然,在设置分辨率是可以分开设置
‘叁’ ffmpeg视频压缩踩坑总结
在进行ffmpeg视频压缩时,可能面临一些挑战。使用ffmpeg将视频上传至阿里云OSS,并尝试将其压缩为压缩包格式,然而,服务器需要对上传的压缩包进行解压,这一过程会耗费资源,影响用户体验。因此,直接使用压缩包上传的方案不可行。
移动设备常用的视频格式包括mp4和mov。为了减小视频体积,通常会考虑转换成其他格式。ffmpeg是一个强大的C/C++语言编写的视频处理库,可以实现这一目的。虽然它不是JavaScript语言的实现,但其功能在浏览器环境中通过WebAssembly技术得以运行。
ffmpeg压缩视频的代码实现相对简单,仅需几行代码即可完成。然而,在实际应用中,可能会遇到运行错误,例如在chrome92版本中,SharedArrayBuffer的使用受到限制。解决这一问题的方法包括降级使用ArrayBuffer或调整服务端响应的COOP和COEP状况。这些方法可能会对功能产生影响或影响跨域资源的加载。
总结来说,虽然ffmpeg提供了强大的视频处理功能,但在某些场景下,如用户上传视频时,其压缩时间较长且可能影响到跨域资源的加载,因此可能不适合直接用于此场景。对于ffmpeg转码压缩视频的具体实现细节和代码,可以参考其GitHub仓库或相关教程。
‘肆’ ffmpeg基础知识
ffmpeg是音视频处理的c库, 音视频在网络传输过程中,由于数据量大,所有需要进行压缩
压缩目的为了去除冗余信息,冗余信息分为:
1、空间冗余:图像相邻像素之间有较强的相关性
2、时间冗余:视频序列的相邻图像之间内容相似
3、 编码冗余:不同像素值出现的概率不同
4、 视觉冗余:人的视觉系统对某些细节不敏感
5、知识冗余:规律性的结构可由先验知识和背景知识得到
● 无损压缩(Winzip)
压缩前解压缩后图像完全一致
压缩比低
● 有损压缩(H.264)
压缩前解压缩后图像不一致
压缩比高
利用人的视觉系统的特性(人眼能见的动画频率和图像细节有限制)
音视频压缩其实就是对音视频进行编码,
视频编码格式
音频编码格式
封装格式
流媒体协议
YUV ,是一种 颜色 编码 方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV是编译true-color颜色空间(colorspace)的种类,Y'UV,YUV, YCbCr , YPbPr 等专有名词都可以称为YUV,彼此有重叠。“Y”表示 明亮度 (Luminance、Luma),“U”和“V”则是**[色度]
YUV格式有两大类:(平面格式)planar和(打包格式)packed。
1.planar:先存储Y,然后U,然后V
2.packed:yuv交叉存储
还有我们常说的YUV420sp与YUV420p。
YUV420sp: 一种two-plane模式,即Y和UV分为两个平面,U、V交错排列。
YUV420p: 先把U存放完后,再存放V。UV是连续的。
YUV420的数据大小为: 亮度(行×列) + V(行×列/4) + U(行×列/4)即:W H 3/2,
普遍的编码器都以接受planar的I420数据(YUV420P)
4*4的I420数据排列如下:
y1 y2 y3 y4
y5 y6 y7 y8
y9 y10 y11 y12
y13 y14 y15 y16
u1 u2 u3 u4
v1 v2 v3 v4
Android相机的采集的视频是NV21(YUV420sP), 也是YUV的格式 只不过U和V的交叉的。
y1 y2 y3 y4
y5 y6 y7 y8
y9 y10 y11 y12
y13 y14 y15 y16
u1 v1 u2 v2
u3 v3 u4 v4
在采集相机数据时需要把UV数据给转换成上面的 顺序。
I frame :帧内编码帧 ,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。
P frame: 前向预测编码帧,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
B frame: 双向预测内插编码帧 ,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;
I frame:自身可以通过视频解压算法解压成一张单独的完整的图片。
P frame:需要参考其前面的一个I frame 或者B frame来生成一张完整的图片。
B frame:则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。
PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的帧数据在什么时候开始送入解码器中进行解码。
在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。
DTS主要用于视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出.在显示的时候使用。
如上图:I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.
libavformat
用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec
用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。
libavfilter
filter(FileIO、FPS、DrawText)音视频滤波器的开发,如水印、倍速播放等。
libavutil
包含一些公共的工具函数的使用库,包括算数运算 字符操作;
libswresample
原始音频格式转码。
libswscale
(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。
音视频解5封装流程:
ffmpeg解码流程: