FFmpeg介绍

A complete, cross-platform solution to record, convert and stream audio and video.

FFmpeg是一个音视频流录制、转换的跨平台的完整开源解决方案

20200816205600-gTO9QB

安装

访问 FFmpeg官网 进行安装

FFmpeg家族工具

  • ffmpeg: 音视频编解码命令行工具
1
ffmpeg -i input.avi output.mp4

ffmpeg通过-i参数将input.avi作为输入源,然后进行转码与转封装操作,输出到output.mp4中。ffmpeg转码工作流程如下图。

  • ffplay: 基于FFmpeg的播放器,可以播放本地或者网络视频流
1
ffplay http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
  • ffprobe: 强大的多媒体分析工具

ffprobe可以从媒体文件或者媒体流程中获得媒体信息,比如音频的参数、视频的参数、媒体容器的参数信息等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ffprobe sheep.mp4 -hide_banner

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:05.63, start: 0.000000, bitrate: 1845 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 3360x2100, 1781 kb/s, 29.81 fps, 30 tbr, 16k tbn, 2000k tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: vorbis (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 63 kb/s (default)
Metadata:
handler_name : SoundHandler

一些概念

不少同学可能会把「编码(codec)」和「格式(format)」混为一谈,因为编码和格式的命名有不少相同的,但其实他们是两个不同的概念。为了方便理解,可以将牛奶加工和音频视频的编码和格式做个对比。

功能展现

使用方式

1
2
3
4
ffmpeg -h

Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

使用风格为 ffmpeg {1} {2} -i {3} {4} {5},这五个部分的参数依次如下:

  • 全局参数
  • 输入文件参数
  • 输入文件
  • 输出文件参数
  • 输出文件

也就是 ffmpeg [全局参数] [输入文件参数] -i [输入文件] [输出文件参数] [输出文件]

1
2
3
4
5
6
$ ffmpeg \
-y \ # 全局参数
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数
-i input.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
output.webm # 输出文件

查看格式容器(Muxer and Demuxer)

1
2
ffmpeg -muxers
ffmpeg -demuxers

mp4mkvwebmaviogg等都是格式容器

查看编码器和解码器

1
2
3
ffmpeg -encoders

ffmpeg -decoders

H.264H.265VP8VP9MP3AAC 都是编码格式

录屏

https://trac.ffmpeg.org/wiki/Capture/Capture/Desktop%E4%B8%AD%E6%96%87%E7%89%88%E6%9C%AC

以Mac系统为例

  1. 查看系统设备
1
2
3
4
5
6
7
8
9
10
# ffmpeg -f avfoundation -list_devices true -hide_banner  -i ""

[AVFoundation indev @ 0x7fe828e07c40] AVFoundation video devices:
[AVFoundation indev @ 0x7fe828e07c40] [0] FaceTime高清摄像头(内建)
[AVFoundation indev @ 0x7fe828e07c40] [1] Capture screen 0
[AVFoundation indev @ 0x7fe828e07c40] AVFoundation audio devices:
[AVFoundation indev @ 0x7fe828e07c40] [0] Screenflick Loopback
[AVFoundation indev @ 0x7fe828e07c40] [1] 外置麦克风
[AVFoundation indev @ 0x7fe828e07c40] [2] MacBook Pro麦克风
[AVFoundation indev @ 0x7fe828e07c40] [3] ZoomAudioDevice
  1. 进行视频播放,增加水印
1
ffmpeg -y -f avfoundation -framerate 30 -i "1:1" -i smile.png -filter_complex overlay="64:64" output.mkv

这里的1:1表示第一步中的所有号,也就是Capture screen 0外置麦克风

查看文件编码信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# ffmpeg -i out.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 00:00:05.63, start: 0.000000, bitrate: 1845 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 3360x2100, 1781 kb/s, 29.81 fps, 30 tbr, 16k tbn, 2000k tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: vorbis (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 63 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified

文件转码

1
2
3
4
5
# 转为HEVC/H.265编码
ffmpeg -i out.mkv -c:v libx265 h265.MP4

# 转为H.264编码
ffmpeg -i out.mkv -c:v libx264 out.MP4

视频截图

1
2
3
4
5
6

# 在第5s的第一帧截图
ffmpeg -ss 5 -i output.mp4 -vframes 1 -q:v 2 out.png

# 从第1s开始截图,持续5s,每秒截一帧
ffmpeg -ss 1 -i output.mp4 -t 5 -r 1 output/out-%00d.png

上面例子中,-vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)。

生成GIF

1
2
# 从第2s开始,以每秒15帧的速度持续5s进行截图,然后生成gif
ffmpeg -ss 00:00:02.000 -i out.mp4 -pix_fmt rgb24 -t 5 -frames 15 out.gif

视频裁剪

1
2
# 从第2s开始,连续剪5s然后生成新的视频
ffmpeg -ss 2 -i out.mp4 -t 5 new.mp4

加速、减速视频

1
2
3
4
5
# 视频加速
ffmpeg -i output.mp4 -vf "setpts=0.5*PTS" new.mp4

# 视频减速
ffmpeg -i output.mp4 -vf "setpts=2*PTS" new.mp4

音频文件增加图片

1
ffmpeg -loop 1 -i smile.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4

上面命令中,有两个输入文件,一个是封面图片cover.jpg,另一个是音频文件input.mp3。-loop 1参数表示图片无限循环,-shortest参数表示音频文件结束,输出视频就结束。

提取视频中的音频

1
ffmpeg -i https://g.asyncoder.com/sheep.mp4 -vn -y out.mp3

增加水印

1
2
# 在视频中间增加水印
ffmpeg -i output.mkv -i smile.png -y -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h)/2" output.mp4

overlay用于设置水印位置, main_wmain_h表示视频宽度和高度, overlay_woverlay_h表示水印宽度和高度

直播推流

  • 安装docker环境
1
2
docker pull alfg/nginx-rtmp
docker run -it -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp
  • 推流
1
ffmpeg -re  -stream_loop -1 -i ~/Movies/霸王龙.mp4  -f flv rtmp://l27.0.0.1:1935/stream/mp4

re表示输入视频的帧率, -stream_loop表示循环播放的次数,-表示无限循环

也可以增加水印

1
ffmpeg -re  -stream_loop -1 -i ~/Movies/霸王龙.mp4 -i smile.png -filter_complex overlay="(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h)/2"  -f flv rtmp://l27.0.0.1:1935/stream/mp4

推流到腾讯云

1
ffmpeg -re  -stream_loop -1 -i ~/Movies/霸王龙.mp4 -f flv 'rtmp://103467.livepush.myqcloud.com/live/mp4?txSecret=1e040cdd5347f8ec0d12df305d3cfad9&txTime=5F38A505'

可以通过https://103467.liveplay.myqcloud.com/live/mp4.flv进行访问

  • 测试

可以通过ffplay rtmp://l27.0.0.1:1935/stream/mp4进行测试,也可以访问ffplay http://127.0.0.1:8080/live/mp4.m3u8进行测试

20200814101839-YPRWCa

20200814101605-1EtOgH

20200814102307-KLm7ck

参考资料