ffmpeg音视频编解码入门

一.ffmpeg下载与安装

在官网https://ffmpeg.zeranoe.com/builds/中,下载static版本的ffmpeg文件,解压后里面的bin文件夹里包含了三个.exe文件,其中:

ffmpeg.exe:进行音视频格式转换

ffplay.exe:能够进行音视频播放

ffprobe.exe:查看音视频文件的详细信息

为能够在任何目录下使用这些工具,需要进行环境变量的配置,参考步骤如下:

https://jingyan.baidu.com/article/a17d5285c9b0c48099c8f26a.html

二. 常用命令

更多关于ffmpeg命令的参数,可参考:

https://blog.csdn.net/leixiaohua1020/article/details/12751349

主要参数:

-i 设定输入流 
-f 设定输出格式 
-ss 开始时间 
-t 持续时间

视频参数:

-b 设定视频流量(码率),默认为200Kbit/s 
-r 设定帧速率,默认为25 
-s 设定画面的宽与高 
-aspect 设定画面的比例 
-vn 不处理视频 
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器 

音频参数:

-ab 设置音频码率
-ar 设定采样率 
-ac 设定声音的Channel数 
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 
-an 不处理音频

音频参数前的a,表示音频audio处理,因此,ar:audio resample;c:audio channels; 

1.视频格式转换

ffmpeg.exe -i VID.mp4 VID_mp4_to_avi.avi

将mp4格式的文件转为avi

2.从视频中提取音频

ffmpeg -i VID.mp4 -acoder aac -vn output.acc

采用音频编解码-acodec,并用-vn移除视频,不对视频做处理

ffmpeg -i VID.mp4 -acoder copy -vn output.acc

3.提取视频

ffmpeg -i VID.avi -acodec copy -an VID_no_audio.avi

移除音视频中的音频-an

在实现过程中发现,这个操作对MP4格式不管用,因此可将MP4转为avi格式,再进行音频移除操作

4.视频剪切

ffmpeg -ss 00:00:02 -t 00:00:03 -i input.avi output avi

-ss:为开始切割的时间    -t:表示要切多少时长,上面代码表示从第2秒开始切,切3s时长

5.码率控制

码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。

码率(kbps)=文件大小(bit)*8/时长(s)/1000

如:文件大小为20.8M,时长为1分钟,码率的计算为

bitrate=20.8Mbit/60s=20.8*1024*1024*8bit/60s/1024=2839kbps

若音频的码率为128kbps,那么视频的码率为(2839-128)kbps

ffmpeg控制码率的三种选择:

-minrate  -b:v  -maxrate
  • -b:v:主要是控制平均码率。若一个文件的码率太高,导致文件太大,需要把文件弄小点,但又不破坏分辨率
ffmpeg -i input.avi -b:v 2000k output.avi

上面的操作实现将原码率转为2000kbps

  • 不过,ffmpeg官方wiki建议,同时加上-bufsize,用于设置码率控制缓冲器的大小,设置的好处是让整体码率更趋于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)
ffmpeg -i input.avi -b:v 2000k -bufsize 2000k output.avi
  • -minrate,-maxrate:在线视频有时候,希望码率的波动,不要超过某个阈值
ffmpeg -i input.avi -b:v 2000k -bufsize 2000k -maxrate 2500k output.avi

6. 视频编码格式转换

比如一个视频的编码是MPEG4,想用H264编码,咋办?

ffmpeg -i input.mp4 -vcodec h264 output.mp4

相反也一样

ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

当然了,如果ffmpeg当时编译时,添加了外部的x265或者X264,那也可以用外部的编码器来编码。(不知道什么是X265,可以Google一下,简单的说,就是她不包含在ffmpeg的源码里,是独立的一个开源代码,用于编码HEVC,ffmpeg编码时可以调用它。当然了,ffmpeg自己也有编码器)

ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4

7.将输出的1920*1080缩小到960*540输出:

ffmpeg -i input.mp4 -vf scale=960:540 output.mp4

8.为视频添加logo

ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4

以上是贴到左上角,要贴到其他地方,则:

右上角:ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
左下角:ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
右下角:ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4

如下,将

作为下图的logo

得到

9.去除文件logo 

用ffmpeg的delogo过滤器。

语法:-vf delogo=x:y:w:h[:t[:show]] 
x:y 离左上角的坐标 
w:h logo的宽和高 
t: 矩形边缘的厚度默认值4 
show:若设置为1有一个绿色的矩形,默认值0。

ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4

如:对8中的图像进行去logo,得到

10. 抓取视频的帧,存为jpeg图片

比如:一个视频,提取一些帧,存为jpeg图片,可表示为:

ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%3d.jpeg

其中

-r:表示一秒保存几帧
-q:v:表示存储的图片质量,2为高质量
-f:表示输出的格式,image2表示为图片格式(PS:-f:image2这一块可以缺省)
pic_%3d.jpeg:表示为输出的图片名称

若只截取一段时间的图片,则可表示为:

ffmpeg -i input.mp4 -ss 00:00:02 -t 00:00:05 -r 1 -q:v 2 -f image2 pic-%3d.jpeg

上述代码可表示为从第2秒开始截取,直至截取5秒的长度,即到第7秒 ,得到5张图片

本篇论文参考网址为:

https://www.jianshu.com/p/ddafe46827b7

https://blog.csdn.net/newchenxf/article/details/51364105

更多关于ffmpeg的用法可见:

ffmpeg中文详解

[总结]FFMPEG视音频编解码零基础学习方法

猜你喜欢

转载自blog.csdn.net/Jum_Summer/article/details/89518611

相关文章