最近正好有音视频编辑的需求,虽然之前粗略的了解过FFmpeg不过肯定是不够用的,借此重新学习下;
基本概念ffmpeg概念
Fmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换组成.
ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;libavcodec:用于各种类型声音/图像编解码;libavfilter:滤镜库libavutil:包含一些公共的工具函数;libswscale:用于视频场景比例缩放、色彩映射转换;libpostproc:用于后期效果处理;ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;ffplay:是一个简单的播放器,使用ffmpeg库解析和解码,通过SDL显示;(一般编译完没有带ffplay,新版本版本依赖于sd-2.0,需要安装sdl-2.0才能生成ffplay) 容器/文件(Conainer/File):即特定格式的多媒体文件,一般来说一个视频文件是由视频,音频,字幕等按特定的格式/规则组合到一起的,常见如:
媒体流(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。
数据帧/数据包(Frame/Packet):通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。
一般: Frame对应压缩前的数据,Packet对应压缩后的数据。
编解码器(Codec):视频和音频都需要经过编码,才能保存成文件。编解码器是指以帧为单位实现压缩数据和原始数据之间的相互转换的;
编码:原始数据->压缩数据;
解码:压缩数据->原始数据;
不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。
常用的视频编码格式如下:
示例:原始图形YUV数据用H.264编码成H264帧
常用的音频编码格式如下:
示例:原始声音PCM数据用AAC编码器编码成AAC帧(是的音频也有帧)
复用(mux):把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
解复用(mux):把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)
帧率(Frame rate):n帧率也叫帧频率,用FPS表示。帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
一般电影的帧率为24;
码率(Bit Rate):比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的位数,码率和视频质量成正比,在视频文件中中比特率用bps(bit per second)来表达。
码率越低,表示压缩程度越高,画质越差。
码率越高,视频质量相对越高,视频文件也就越大。
FFmpegFFmpeg是一个很多的项目,包括很多组件:
ffmpeg——一个命令行工具,用来对视频文件转换格式,也支持对电视卡即时编码ffserver——一个HTTP多媒体即时广播流服务器,支持时光平移ffplay——一个简单的播放器,基于SDL与FFmpeg库libavcodec——包含全部FFmpeg音频/视频编解码库libavformat——包含demuxers和muxer库libavutil——包含一些工具库libpostproc——对于视频做前处理的库libswscale——对于视频作缩放的库我们一般说的的FFmpeg 是指FFmpeg 的命令行工具;
第一条FFmpeg命令参数解析
所以这条命令的含义是:把视频input.mp4不修改音频的情况下用libx26编码音频,同时分辨率改成720*1280,格式改成avi;
视频信息
左:input.mp4 ,右:output.avi
可以看到视频文件已经完成了命令操作转换;
FFmpeg常用参数
FFmpeg命令处理流程我们还是以这条命令为例,分析FFmpeg命令对视频的处理经过哪些流程
我们看图:
我们看到命令处理一般分成5个步骤
解复用:把容器文件解析成编码的数据包;解码:解码器把数据包解码成数据帧;filter进行帧处理:把1080 * 1920的数据帧处理成720 * 1280重新编码:编码器libx264重新把数据帧编码成编码的数据包;复用:把数据包按格式avi封装;这个简单流程比较重要,要了然于心;
FFmpeg常用命令打印视频基本信息
转换格式修改分辨率
视频静音处理(移除音频)
从视频中提取图片
-r – 设置帧速度。即,每秒提取帧到图像的数字。默认值是 25。-f – 表示输出格式,即,在我们的实例中是图像。image-%2d.png – 表明我们如何想命名提取的图像。在这个实例中,命名应该像这样image-01.png、image-02.png、image-03.png 等等开始。如果你使用 %3d,那么图像的命名像 image-001.png、image-002.png 等等开始。添加/修改封面
如果需要把视频第一帧截出来坐封面,那就先提取
提取视频里的音频文件
裁剪视频
-filter:v – 表示视频过滤器。crop – 表示裁剪过滤器。w – 我们想自源视频中裁剪的矩形的宽度。h – 矩形的高度。x – 我们想自源视频中裁剪的矩形的 x 坐标 。y – 矩形的 y 坐标。视频截取
-ss 开始时间-t 10,截取十秒视频切割拆分成多个
-t 00:00:13 表示从视频的开始到视频的第 30 秒创建一部分视频。
-ss 00:00:13 为视频的下一部分显示开始时间戳。它意味着第 2 部分将从第 30 秒开始,并将持续到原始视频文件的结尾。
视频合并拼接
设置视屏屏蔽宽高
通常使用的高宽比是:
16:94:316:105:42:21:12:35:12:39:1添加字幕
是字幕文件,然后这里选用的是软字幕方式比较快
总结根据项目需要,简单学习了下音视频的非常基本的概念和FFmpeg的基本使用,留个记录;
[参考]https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html
https://zhuanlan.zhihu.com/p/67878761
到此这篇关于音视频基本概念和FFmpeg的简单入门的文章就介绍到这了,更多相关FFmpeg音视频内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!