写在前面
最近有一个音视频剪辑的需求,虽然之前对它有一个粗略的了解,但肯定是不够的,所以我再重新学习一下;
基本概念容器/文件(/File):
它是一种特定格式的多媒体文件。一般来说,一个视频文件是由视频、音频、字幕等按照特定的格式/规则组成的,比如:
mp4
flv
mkv
avi
媒体流():
表示时间轴上连续的一段数据,比如一段声音数据,一段视频数据或者一段字幕数据,可以压缩也可以不压缩,压缩后的数据需要关联特定的编解码器。
数据帧/数据包(Frame/):
通常,一个媒体流由大量的数据帧组成。对于压缩数据,帧对应于最小编解码器。一个处理单元,将属于不同媒体流的数据帧交错存储在容器中。
:Frame对应压缩前的数据,对应压缩后的数据。
编解码器:
视频和音频都需要先编码,然后才能保存为文件。编解码是指压缩数据与原始数据之间的转换,以帧为单位;
编码:原始数据->压缩数据;
解码:压缩数据->原始数据;
不同的编码格式(CODEC)有不同的压缩率,这会导致文件大小和清晰度的差异。
常用的视频编码格式如下:
H.262
H.264
H.265
例子:原始图形YUV数据用H.264编码成H264帧
常用的音频编码格式如下:
MP3
AAC
示例:原始声音 PCM 数据的 AAC 编码器编码成 AAC 帧(是的,音频也有帧)
多路复用(mux):
不同的流是把某个容器的规则放入容器中,这种行为称为多路复用(mux)
解复用(mux):
从某种容器中解析不同的流,这种行为称为解复用(demux)
帧率:
n帧率也称为帧频,以FPS表示。帧率是视频文件每秒的帧数,用肉眼看到连续运动的图像至少需要 15 帧。
一般电影的帧率为24;
比特率:
比特率(也称为比特率,数据率)是一个整体视频/音频质量的参数,以秒为单位处理的比特数,比特率与视频质量成正比。在视频文件中,比特率以bps(bit per )表示。
码率越低,压缩率越高,画质越差。
码率越高,视频质量越高,视频文件越大。
这是很多项目,包括很多组件:
我们一般指的是命令行工具;
第一个命令
ffmpeg -y -i input.mp4 -acodec copy -vcodec libx264 -s 720x1280 output.avi
参数解析
-y # 全局参数,等于npm -y
-i input.mp4 #输入文件,FFmpeg命令有位置之分, -i 之前是输入参数,之后是输出参数
-acodec copy #输出文件参数,复制音频编码而不用重新编码
-vcodec libx26 #输出文件参数,重新用libx26编码(比较慢耗性能)
-s 720x1280 #输出参数,
output.avi #输出文件
可以看到,FFmpeg一般分为这五个部分,大家参考上面命令对号入座
全局参数
输入文件参数
输入文件
输出文件参数
输出文件
所以这条命令的意思是:在视频input.mp4中使用编码后的音频,不修改音频,将分辨率改为720*1280,格式改为avi;
视频信息
左:input.mp4,右:.avi
通过命令操作可以看到视频文件已经转换完毕;
常用参数
-c:指定编码器
-c copy:直接复制,不经过重新编码
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流,不处理视频
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。
-s: size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-b: bitrate 设置比特率,缺省200kb/s
-vcodec: codec 强制使用codec编解码方式。 如果用copy表示原始编解码数据直接被拷贝。
-filter: 视频过滤器,如 -filter:v "crop=w:h:x:y"用过滤器v裁剪视频
w - 源视频中裁剪的矩形的宽度
h – 矩形的高度。
x – 我们想自源视频中裁剪的矩形的 x 坐标 。
y – 矩形的 y 坐标。
-aspect:设置横纵比 4:3 16:9 或 1.3333 1.7777
-ss:position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持,比如用来指定剪切开始时间
命令处理流程
我们还是以这条命令为例来分析一下命令对视频处理的流程是什么?
ffmpeg -y -i input.mp4 -acodec copy -vcodec libx264 -s 720x1280 output.avi
我们看图:
我们来看看命令处理一般分为5个步骤。
解复用:将容器文件解析成编码数据包;解码:解码器将数据包解码成数据帧;帧处理:1080 * 1920 将数据帧处理成720 * 1280并重新编码:编码器将数据帧重新编码成编码数据包;复用:数据包以avi格式封装;
这个简单的过程比较重要,一定要了解雨欣;
常用命令
打印视频基本信息
$ ffmpeg -i input.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42mp41isomavc1
creation_time : 2021-05-29T16:51:47.000000Z
Duration: 00:00:30.61, start: 0.000000, bitrate: 5932 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1080x1920, 5672 kb/s, 60 fps, 60 tbr, 60 tbn (default)
Metadata:
creation_time : 2021-05-29T16:51:47.000000Z
handler_name : L-SMASH Video Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 253 kb/s (default)
Metadata:
creation_time : 2021-05-29T16:51:47.000000Z
handler_name : L-SMASH Audio Handler
vendor_id : [0][0][0][0]
At least one output file must be specified
转换格式修改分辨率
ffmpeg -y -i input.mp4 -s 720x1280 output.avi
静音视频(删除音频)
ffmpeg -i input.mp4 -an quiet.mp4
从视频中提取图片
p>
ffmpeg -i input.mp4 -r 1 -f image2 -ss 00:00:10 -t 2 image-%2d.png
添加/修改封面
ffmpeg -y -i input.mp4 -i cover.png -map 0 -map 1 -c copy -disposition:v:1 attached_pic cover_output.mp4
如果需要剪掉视频封面的第一帧,那么先提取出来
ffmpeg -ss 00:00:01 -i input.mp4 -f image2 cover.png
提取视频中的音频文件
ffmpeg -i input.mp4 -vn -c:a copy output.aac
剪辑视频
ffmpeg -i input.mp4 -filter:v "crop=640:480:120:240" cut.mp4
视频拍摄
ffmpeg -i input.mp4 -ss 00:00:05 -codec copy -t 10 cutout.mp4
视频剪切并分割成多个
ffmpeg -i input.mp4 -t 00:00:13 -c copy part1.mp4 -ss 00:00:13 -codec copy part2.mp4
视频合并拼接
ffmpeg -i "concat:part1.mp4|part2.mp4" -c:a copy -c:v copy combine.mp4
设置屏幕宽度和高度
ffmpeg -i input.mp4 -aspect 4:3 4_3.mp4
常用的纵横比有:
添加字幕
.srt是字幕文件,那么这里的条件就是软字幕更快
总结
根据项目需要,简单学习了音视频
[参考]
廖庆福视频教程
暂无评论内容