导语:ffmpeg是业界常用的一种视频编解码工具,之前写的一个视频网站小项目中用到了这款视频处理软件,现在就这个学习使用方法做一个总结和归纳。
# 目录
- 工具简介
- 安装ffmpeg
- 使用方法
- 常见场景
# 工具简介
ffmpeg是全球领先的多媒体框架,能够解码、编码、转码、混合、解密、流媒体、过滤和播放所有格式,支持格式广泛,具有高度的便携性。
ffmpeg可以在Linux、Mac OS X、Microsoft Windows、BSDs、Solaris 等各种构建环境、机器架构和配置下编译、运行,并通过测试基础设施FATE。
它包含了 libavcodec、libavutil、libavformat、libavfilter、libavdevice、libswscale 和 libswresample,可以被应用程序使用。
其中包含的ffmpeg、ffplay 和 ffprobe,可以被终端用户用于转码和播放。
# 安装ffmpeg
# 下载方式
windows:
MacOS:
Linux:
- Static Builds (opens new window)
- debian (opens new window)
- debian-multimedia (opens new window)
- ubuntu (opens new window)
- Fedora&RHEL (opens new window)
# 安装方法
# windows安装
- 旧版查看
我之前安装的是4.x的版本,现在也安装新的版本看一下,这个是不冲突的。
- 新版安装
我下载的是这个版本的ffmpeg-5.1.1-essentials_build.zip
。
- 解压安装包
下载好后,解压好后,加入全局环境变量,在命令行工具打印版本信息。
- 打印版本
打印版本以及帮助信息,可以看到成功的出来了。
# Linux安装
注意,请将gcc尽量升级至高版本,不然安装使用可能会报错,我之前就遇到过这个问题。
检测安装gcc:
- 查看gcc版本
gcc -v
可以看到我的版本是比较低的,可以升级一下。
- 安装Development Tools
我用的centos7,所以就以centos7为例,安装开发工具。
yum groupinstall "Development Tools"
- 查看基础库
- 下载gcc最新版解
cd /usr/local/src
wget https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz --no-check-certificate
tar -zxvf gcc-11.2.0.tar.gz
2
3
- 安装gcc
download_prerequisites
脚本会帮助我们下载、配置、安装依赖库。
然后生成MakeFile文件,编译gcc,最后安装。
cd gcc-11.2.0
./contrib/download_prerequisites
./configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
make -j4
make install
2
3
4
5
- 配置gcc
find ./ -name "libstdc++.so*"
./build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.29
./build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.29
./build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.29
./build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
2
3
4
5
6
7
8
9
10
cd /usr/lib64
cp /usr/local/src/gcc-11.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.29 .
mv libstdc++.so.6 libstdc++.so.6.old
ln -sv libstdc++.so.6.0.29 libstdc++.so.6
2
3
4
- 查看升级后的版本
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/11.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.2.0 (GCC)
2
3
4
5
6
7
8
- 查看升级后的基础库
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.14
GLIBC_2.6
GLIBC_2.4
GLIBC_2.16
GLIBC_2.17
GLIBC_2.3.2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
安装Linux包:
- 下载解压包
cd /usr/local/src
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar -xvf ffmpeg-release-amd64-static.tar.xz
mv ffmpeg-5.1.1-amd64-static ffmpeg-5.1.1
mv ffmpeg-5.1.1 /usr/local/
2
3
4
5
- 添加全局变量
ln -s /usr/local/ffmpeg-5.1.1/ffmpeg /usr/local/bin
ln -s /usr/local/ffmpeg-5.1.1/ffprobe /usr/local/bin
cd ffmpeg
2
3
- 查看ffmpeg版本
ffmpeg
linux安装就到这里。
# 使用方法
# 查看网页文档
# 查看帮助手册
ffmpeg -h
打印出以下信息。
ffmpeg version 5.1.1-essentials_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 12.1.0 (Rev2, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libgme --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
libavutil 57. 28.100 / 57. 28.100
libavcodec 59. 37.100 / 59. 37.100
libavformat 59. 27.100 / 59. 27.100
libavdevice 59. 7.100 / 59. 7.100
libavfilter 8. 44.100 / 8. 44.100
libswscale 6. 7.100 / 6. 7.100
libswresample 4. 7.100 / 4. 7.100
libpostproc 56. 6.100 / 56. 6.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Getting help:
-h -- print basic options
-h long -- print more options
-h full -- print all options (including all format and codec specific options, very long)
-h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol
See man ffmpeg for detailed description of the options.
Print help / information / capabilities:
-L show license
-h topic show help
-? topic show help
-help topic show help
--help topic show help
-version show version
-buildconf show build configuration
-formats show available formats
-muxers show available muxers
-demuxers show available demuxers
-devices show available devices
-codecs show available codecs
-decoders show available decoders
-encoders show available encoders
-bsfs show available bit stream filters
-protocols show available protocols
-filters show available filters
-pix_fmts show available pixel formats
-layouts show standard channel layouts
-sample_fmts show available audio sample formats
-dispositions show available stream dispositions
-colors show available color names
-sources device list sources of the input device
-sinks device list sinks of the output device
-hwaccels show available HW acceleration methods
Global options (affect whole program instead of just one file):
-loglevel loglevel set logging level
-v loglevel set logging level
-report generate a report
-max_alloc bytes set maximum size of a single allocated block
-y overwrite output files
-n never overwrite output files
-ignore_unknown Ignore unknown stream types
-filter_threads number of non-complex filter threads
-filter_complex_threads number of threads for -filter_complex
-stats print progress report during encoding
-max_error_rate maximum error rate ratio of decoding errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.
-vol volume change audio volume (256=normal)
Per-file main options:
-f fmt force format
-c codec codec name
-codec codec codec name
-pre preset preset name
-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile
-t duration record or transcode "duration" seconds of audio/video
-to time_stop record or transcode stop time
-fs limit_size set the limit file size in bytes
-ss time_off set the start time offset
-sseof time_off set the start time offset relative to EOF
-seek_timestamp enable/disable seeking by timestamp with -ss
-timestamp time set the recording timestamp ('now' to set the current time)
-metadata string=string add metadata
-program title=string:st=number... add program with specified streams
-target type specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
-apad audio pad
-frames number set the number of frames to output
-filter filter_graph set stream filtergraph
-filter_script filename read stream filtergraph description from a file
-reinit_filter reinit filtergraph on input parameter changes
-discard discard
-disposition disposition
Video options:
-vframes number set the number of video frames to output
-r rate set frame rate (Hz value, fraction or abbreviation)
-fpsmax rate set max frame rate (Hz value, fraction or abbreviation)
-s size set frame size (WxH or abbreviation)
-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-vn disable video
-vcodec codec force video codec ('copy' to copy stream)
-timecode hh:mm:ss[:;.]ff set initial TimeCode value.
-pass n select the pass number (1 to 3)
-vf filter_graph set video filters
-ab bitrate audio bitrate (please use -b:a)
-b bitrate video bitrate (please use -b:v)
-dn disable data
Audio options:
-aframes number set the number of audio frames to output
-aq quality set audio quality (codec-specific)
-ar rate set audio sampling rate (in Hz)
-ac channels set number of audio channels
-an disable audio
-acodec codec force audio codec ('copy' to copy stream)
-vol volume change audio volume (256=normal)
-af filter_graph set audio filters
Subtitle options:
-s size set frame size (WxH or abbreviation)
-sn disable subtitle
-scodec codec force subtitle codec ('copy' to copy stream)
-stag fourcc/tag force subtitle tag/fourcc
-fix_sub_duration fix subtitles duration
-canvas_size size set canvas size (WxH or abbreviation)
-spre preset set the subtitle options to the indicated preset
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# 基本语法
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
ffmpeg options -i input_file options output_file
#1、参数选项:
#(1) -an: 去掉音频(audio no)
#(2) -acodec: 音频选项, 一般后面加copy表示拷贝
#(3) -vcodec:视频选项,一般后面加copy表示拷贝
#2、格式:
#(1) h264: 表示输出的是h264的视频裸流
#(2) mp4: 表示输出的是mp4的视频
#(3)mpegts: 表示ts视频流
2
3
4
5
6
7
8
9
10
# 常见场景
# 视频转换
mpeg4
转为h264
ffmpeg -i test.mp4 -vcodec h264 out.mp4
mp4
转为avi
ffmpeg -i test.mp4 -vcodec h264 out.avi
mp4
转为ts
ffmpeg -i test.mp4 -vcodec copy -f mpegts out.ts
mp4
转为flv
ffmpeg -i test.mp4 -vcodec copy -f flv out.flv
# 网络推流
- udp视频流推送
ffmpeg -re -i out.ts -c copy -f mpegts udp://localhost:1935
- rtmp推流
ffmpeg -re -i out.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/hello
# 提取音频
ffmpeg -i test.mp4 -acodec aac out.aac
ffmpeg -i out.aac -acodec mp3 out.mp3
2
# 视频截图
ffmpeg -i test.mp4 -y -f image2 -t 0.001 -s 300x200 t1.jpg
ffmpeg -i test.mp4 -y -f image2 -t 0.001 t2.jpg
ffmpeg -i test.mp4 -vframes 10 -y -f gif t3.gif
ffmpeg -i test.mp4 -y -f image2 -ss 12 -t 0.001 t4.jpg
2
3
4
# 屏幕录制
ffmpeg -y -f gdigrab -i desktop t5.png
ffmpeg -y -f gdigrab -s 1920x1040 -offset_x 0 -offset_y 0 -i desktop -frames:v 1 t6.png
ffmpeg -y -f gdigrab -i title="百度一下,你就知道 - Google Chrome" -frames:v 1 t7.jpg
ffmpeg -y -f gdigrab -s 520x520 -offset_x 0 -offset_y 0 -i title="百度一下,你就知道 - Google Chrome" -frames:v 1 t8.jpg
ffmpeg -y -r 1 -f gdigrab -i desktop -vcodec libx264 t9.mp4
ffmpeg -thread_queue_size 1000 -r 30 -f gdigrab -s 1820x880 -offset_x 100 -offset_y 200 -i desktop -vcodec libx264 -acodec copy -preset:v ultrafast -tune:v zerolatency -max_delay 10 -g 50 -sc_threshold 0 -f flv rtmp://localhost:4002/streamName/live
2
3
4
5
6
# 视频截切
ffmpeg -ss 00:00:10 -t 00:00:20 -i test.mp4 -vcodec copy -acodec copy out2.mp4
# 添加水印
ffmpeg -y -i test.mp4 -i logo.jpg -filter_complex overlay out3.mp4
# 切割ts分片
- hls_time n: 每片长度
- hls_list_size n: 列表条目
- hls_wrap n: 设置几片后覆盖
- hls_start_number n: 列表中sequence number的值
ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls ./m3u8/out1.m3u8
ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 ./m3u8/out2.m3u8
2
# 视频分解
ffmpeg -i test.mp4 -r 1 -f image2 ./imgs/test-%3d.jpg
# 视频合并
- 将ts视频合并为mp4视频
ffmpeg -i "concat:m3u8/out10.ts|m3u8/out11.ts|m3u8/out12.ts" -acodec copy -vcodec copy -absf aac_adtstoasc ./m3u8/out1_01.mp4
ffmpeg -f concat -i ./m3u8/ts_list.txt -c copy ./m3u8/out1_02.mp4
2
- 将图片合成为mp4视频
ffmpeg -f image2 -i ./imgs/test-%3d.jpg out4.mp4
- 音视频合成为视频
ffmpeg -y -i test2.mp4 -i test2.mp3 -vcodec copy -acodec copy out5.mp4
# 信息查询
- 查看视频信息
ffmpeg -i test2.mp4
ffprobe -i test2.mp4
2
- 查看所有格式
ffmpeg -formats
- 查看所有编解码器
ffmpeg -codecs
- 查看所有filter
ffmpeg -filters
- 查看所有图片格式
ffmpeg -pix_fmts
- 查看所有像素格式
ffmpeg -sample_fmts
# 写在最后
以上就是有关ffmpeg的一些简单介绍、安装和方法使用。