使用FFmepg进行视频转码、视频格式转换、图片提取等!

一、什么是FFmpeg?

        FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

        FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。

二、安装FFmpeg

在Ubuntu中安装FFmpeg非常简单,只需在终端中输入如下命令即可自动安装:

sudo apt-get install ffmpeg

三、常用参数解释

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

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

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

四、常用功能的使用方法

1.视频格式转换

比如avi转mp4,或者mp4转ts

ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts

2. 提取音频

ffmpeg -i input.mp4 -acodec copy -vn output.aac

上面的命令,默认mp4的audio codec是aac,如果不是会出错,咱可以暴力一点,不管什么音频,都转为最常见的aac。

ffmpeg -i input.mp4 -acodec acc -vn output.aac

-vn: 不处理视频 

3.提取视频

将带有音频的视频提取为纯视频:

ffmpeg -i input.mp4 -vcodec copy -an output.mp4

-an :不处理音频

4. 视频剪切

ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4

-ss表示开始切割的时间,-t表示要切多少。上面就是从开始,切5秒钟出来。

       注意一个问题,ffmpeg 在切割视频的时候无法做到时间绝对准确,因为视频编码中关键帧(I帧)和跟随它的B帧、P帧是无法分割开的,否则就需要进行重新帧内编码,会让视频体积增大。所以,如果切割的位置刚好在两个关键帧中间,那么 ffmpeg 会向前/向后切割,所以最后切割出的 chunk 长度总是会大于等于应有的长度。

5. 码率控制

      码率控制对于在线视频比较重要。因为在线视频需要考虑其能提供的带宽。那么,什么是码率?很简单:bitrate = file size / duration,比如一个文件20.8M,时长1分钟,那么,码率就是:biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps

一般音频的码率只有固定几种,比如是128Kbps, 那么,video的就是:video biterate = 2831Kbps -128Kbps = 2703Kbps。说完背景了。好了,来说ffmpeg如何控制码率。 ffmpg控制码率有3种选择,-minrate -b:v -maxrate

  • -b:v主要是控制平均码率。 比如一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
  • 不过,ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize-bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)

ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
  • -minrate -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。

ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4

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.只提取视频ES数据

ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264

8.过滤器的使用

参考:ffmpeg filter过滤器 基础实例及全面解析

例1:将输入的1920x1080缩小到960x540输出

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

//ps: 如果540不写,写成-1,即scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。

例2:为视频添加logo

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

9.从视频中提取图像帧

ffmpeg -i test.mp4 -r 1 PATH/TO/IMAGE/image-%05d.jpeg
# -r,指定抽取视频的帧率,即从视频中每秒抽取的帧数,默认是每秒24帧。image-%5d.jpeg,指定输出文件的名字。

ffmpeg -i test.mp4 -r 1 -t 4 PATH/TO/IMAGE/image-%05d.jpeg
# -t,表示取t秒时间的帧

ffmpeg -i test.mp4 -r 1 -ss 00:00:40 PATH/TO/IMAGE/image-%05d.jpeg
# -ss,表示截取帧初始时间

ffmpeg -i test.mp4 -r 1 -ss 00:00:40 -vframes 10 PATH/TO/IMAGE/image-%05d.jpeg
# -vframes,表示截取多少帧

全文参考:https://www.jianshu.com/p/ddafe46827b7

你可能感兴趣的:(视频处理,Linux系统)