使用ffmpeg处理音视频

Table of Contents

安装ffmpeg

brew install ffmpeg

视频处理

1. 剪辑

举个例子,当我们要截取视频文件中input.mp4的第15秒到第98秒时,ffmpeg命令行可以这么写:

ffmpeg -i input.mp4 -ss 15 -to 98 -c:v copy output.mp4
ffmpeg -i input.mp4 -ss 00:12:01 -to 00:15:21 -c:v copy output.mp4
ffmpeg -i input.mp4 -ss 00:12:01 -t 60 -c:v copy output.mp4

参数解释:

  • -i 代表输入待处理的文件
  • -ss 代表开始的时间
  • -to 代表结束的时间
  • -t 代表截取的长度。
  • 如果你同时使用了-t和-to参数,那么ffmpeg会优先使用-t参数的值,也就是说-to参数无效

2. 缩放

很多时候我们需要把一个高分辨率的视频处理成一个低分辨率的视频,以达到减小视频体积的目的。举个例子:把一个10801920的视频缩小到360640

#1080*1920-->360*640
ffmpeg -i in.mp4 -vf scale=360:640 -acodec aac -vcodec h264 out.mp4

参数解释:

  • -i 代表输入
  • -vf 的全称是video filter,即:视频滤镜,缩放其实就是给视频添加一个滤镜。
  • scale=360:640 scale是一种滤镜,缩放滤镜,格式是:scale=width:height,其中,width和height分别是处理后的宽和高

3. 裁剪

有时候我们想截取一个大视频的中间一部分画面,比如一个10801920的视频,我们想截取中间的10801080的部分,这个也可以实现的:

ffmpeg -i in.mp4 -strict -2 -vf crop=1080:1080:0:420 out.mp4

参数解释:

  • crop 和上面的scale一样,也是视频滤镜的一种
  • crop是裁剪滤镜。
  • 四个参数分别是 `width:height:x:y`,
    • width 宽
    • height 高
    • x和y代表裁剪的区域的左上角的坐标,坐标系原点为原视频的左上角。
    • 比如 0:0就代表原视频的左上角,50:50就代表以原视频的左上角为原点的坐标系的50:50位置

4. 旋转

使用ffmpeg可以轻松地旋转视频。举个例子:将一个视频顺时针旋转90度

ffmpeg -i in.mp4 -vf rotate=PI/2:ow=1080:oh=1920 out.mp4

参数解释:

  • 视频旋转其实也是一直滤镜。
  • rotate=PI/2 rotate是旋转滤镜,后面的“PI/2”旋转角度(正数代表顺时针),这里是90度
  • rotate除了指定旋转角度的参数外,还有其他一些参数:
  • ow 全称是out width,输出视频的宽度,如果不指定,默认是输入视频的宽度
  • oh 全称是out height,输出视频的高度,如果不指定,默认是输入视频的高度

5. 调节帧率

帧率会很大程度上影响画面的流畅度和视频的体积,帧率越大,画面越流畅,同时视频体积越大。

我们有时候需要通过降低帧率来减小视频的体积。

举个例子:将一个视频的帧率降到15

ffmpeg -i in.mp4 -r 15 out.mp4

参数解释:

  • -r 帧率

6. 格式转换

ffmpeg具备强大的格式转换功能,这里举几个常用的例子。

ffmpeg -i in.mov -vcodec copy -acodec copy out.mp4  // mov --> mp4
ffmpeg -i in.flv -vcodec copy -acodec copy out.mp4 // flv --> mp4
ffmpeg -i in.gif -vf scale=420:-2,format=yuv420p out.mp4  // gif --> mp4

7. 查看视频的详细信息

有的时候我们需要在处理之前先了解一下视频的参数信息,比如分辨率、比特率等等。可以使用下面的命令:

# 不加任何参数,只指定输入的视频
ffmpeg -i in.mp4

格式转化

ffmpeg -i gfc.mp4 gfc.gif

调节帧率压缩体积

ffmpeg -i gfc.gif -r 15 gfc15.gif
ffmpeg -i gfc.gif -r 10 gfc10.gif
ffmpeg -i gfc.gif -r 5 gfc5.gif

.mp4 文件切分成 .ts

ffmpeg -i input.mp4 -c copy -map 0 -f segment -segment_list_type mpegts -segment_list entry_list.m3u8 -segment_format mpegts output_%03d.ts

  • 这个命令会将 input.mp4 切分成多个 .ts 文件,并且创建一个 entry_list.m3u8 播放列表文件。
  • 生成的 .m3u8 文件是一个播放列表,可以用来在支持 MPEG-TS 流的播放器中播放切分的视频片段。

-i input.mp4:指定输入文件。
-c copy:表示复制原始流,不进行重新编码。
-map 0:将所有流(视频、音频等)从输入文件映射到输出。
-f segment:指定输出格式为片段。
-segment_list_type mpegts:指定播放列表的类型为 MPEG-TS。
-segment_list entry_list.m3u8:指定播放列表文件的名称。
-segment_format mpegts:指定每个片段的格式为 MPEG-TS。
output_%03d.ts:指定输出文件的命名模式,%03d 表示数字部分将被自动递增。

资源

Date: 2019-04-18 Thu 21:32