ffmpeg基础知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg基础知识相关的知识,希望对你有一定的参考价值。

参考技术A

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解码流程:

ffmpeg 常用知识点收集

ffmpeg 常用知识点收集

一、基础简介

FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能1,包含了libavcodec ─这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。

FFmpeg官网:https://www.ffmpeg.org/

Github地址:https://github.com/FFmpeg/FFmpeg

FFmpeg项目由以下几部分组成:
  • FFmpeg视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件;

  • ffserver基于HTTPRTSP用于实时广播的多媒体服务器.也支持时间平移;

  • ffplaySDLFFmpeg库开发的一个简单的媒体播放器;

  • libavcodec一个包含了所有FFmpeg音视频编解码器的库。为了保证最优性能和高可复用性,大多数编解码器从头开发的;

  • libavformat一个包含了所有的普通音视格式的解析器和产生器的库。

 

帧率:帧率(Frame rate)也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。

码率:比特率(Bit rate)(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。

帧率
1、用 -r 参数设置帧率

ffmpeg –i input –r fps output

2、用fps filter设置帧率

ffmpeg -i 1.mp4-vf fps=fps=25 11.mp4

例如设置帧率为29.97fps,下面三种方式具有相同的结果:

ffmpeg -i input.avi -r 29.97 output.mp4
ffmpeg -i input.avi -r 30000/1001 output.mp4
ffmpeg -i input.avi -r netsc output.mp4

 码率】设置参数-b

ffmpeg -i 1.mp4 -b 1.5M 2.mp4

音频:-b:a

视频: - b:v

设置视频码率为1500kbps

ffmpeg -i input.avi -b:v 1500k output.mp4

控制输出文件大小

-fs (file size首字母缩写)

ffmpeg -i input.avi -fs 1024K output.mp4

计算输出文件大小:( 视频码率 + 音频码率 ) * 时长 / 8 = 文件大小(K)

二、视频压缩

命令行参数-crf

优先保证画面质量(转码时间可能较长)的情况下,使用-crf参数压缩,取值范围为0~51,其中0为无损模式,数值越大,画质越差,输出文件越小。

参考值:18~28,18被认为是视觉无损的,输出视频质量和输入视频相当。

ffmpeg -i 源文件.mov -c:v libx264 -preset veryslow -crf 18 -c:a copy 目标文件.mp4

意思是:将D盘的源文件src.mov,以 veryslow 的速度重新编码成H.264格式并保存为mp4文件。-preset指定的编码速度越慢,获得的压缩效率就越高。

查看 -preset 取值范围:

ffmpeg -i 源文件.mov -c:v libx264 -preset -tune 目标文件.mp4

-c:a copy 是将音频数据从源文件中以原有编码格式直接拷入目标文件。

-c:v 参数取值查看

ffmpeg -encoders

三、ffmpeg 视频转ts切片 生成m3u8视频播放列表

1、首先将视频文件转为视频编码h264,音频编码aac格式的mp4文件

使用ffprobe查看文件编码方式

ffprobe input.mkv

如果音视频编码为h264/aac则执行

ffmpeg -i input.mkv -acodec copy -vcodec copy out.mp4

否则执行

ffmpeg -i input.mkv -acodec libfaac -vcodec libx264 out.mp4

2、将mp4文件转为ts文件并生成m3u8

1. 将mp4转为完整的ts

ffmpeg -i out.mp4 -c copy -bsf h264_mp4toannexb output.ts

      2. 将ts切片,并生成m3u8文件

ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts

以上是关于ffmpeg基础知识的主要内容,如果未能解决你的问题,请参考以下文章

FFMpeg视频开发与应用基础五调用FFMpeg SDK封装音频和视频为视频文件

ffmpeg基础Linux环境下ffmpeg的配置(Ubuntu 18.04)

FFmpeg库视频解码初探(软硬件解码)

ffmpeg填充翻动旋转视频的基础知识

我的第一本书《FFmpeg音视频开发基础与实战》已正式出版

我的第一本书《FFmpeg音视频开发基础与实战》已正式出版