ffmpeg工具的学习和实践

导语:ffmpeg是业界常用的一种视频编解码工具,之前写的一个视频网站小项目中用到了这款视频处理软件,现在就这个学习使用方法做一个总结和归纳。

# 目录

  • 工具简介
  • 安装ffmpeg
  • 使用方法
  • 常见场景

# 工具简介

ffmpeg是全球领先的多媒体框架,能够解码、编码、转码、混合、解密、流媒体、过滤和播放所有格式,支持格式广泛,具有高度的便携性。

ffmpeg可以在Linux、Mac OS X、Microsoft Windows、BSDs、Solaris 等各种构建环境、机器架构和配置下编译、运行,并通过测试基础设施FATE。

它包含了 libavcodec、libavutil、libavformat、libavfilter、libavdevice、libswscale 和 libswresample,可以被应用程序使用。

其中包含的ffmpeg、ffplay 和 ffprobe,可以被终端用户用于转码和播放。

# 安装ffmpeg

ffmpeg官网 (opens new window)

# 下载方式

windows

MacOS:

Linux

# 安装方法

# windows安装

  • 旧版查看

我之前安装的是4.x的版本,现在也安装新的版本看一下,这个是不冲突的。

旧版查看

  • 新版安装

我下载的是这个版本的ffmpeg-5.1.1-essentials_build.zip

gyan安装

  • 解压安装包

下载好后,解压好后,加入全局环境变量,在命令行工具打印版本信息。

gyan安装

  • 打印版本

打印版本以及帮助信息,可以看到成功的出来了。

gyan安装

# Linux安装

注意,请将gcc尽量升级至高版本,不然安装使用可能会报错,我之前就遇到过这个问题。

检测安装gcc

  • 查看gcc版本
gcc -v
1

gcc

可以看到我的版本是比较低的,可以升级一下。

  • 安装Development Tools

我用的centos7,所以就以centos7为例,安装开发工具。

yum groupinstall "Development Tools"
1
  • 查看基础库

gcc

  • 下载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
1
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
1
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
1
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
1
2
3
4
  • 查看升级后的版本
gcc -v
1
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)
1
2
3
4
5
6
7
8
  • 查看升级后的基础库
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
1
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
1
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包

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/
1
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
1
2
3
  • 查看ffmpeg版本
ffmpeg
1

ffmpeg

linux安装就到这里。

# 使用方法

# 查看网页文档

ffmpeg官方文档 (opens new window)

# 查看帮助手册

ffmpeg -h
1

打印出以下信息。

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
1
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视频流
1
2
3
4
5
6
7
8
9
10

# 常见场景

# 视频转换

视频转换

  • mpeg4转为h264
ffmpeg -i test.mp4 -vcodec h264 out.mp4
1
  • mp4转为avi
ffmpeg -i test.mp4 -vcodec h264 out.avi
1
  • mp4转为ts
ffmpeg -i test.mp4 -vcodec copy -f mpegts out.ts
1
  • mp4转为flv
ffmpeg -i test.mp4 -vcodec copy -f flv out.flv
1

# 网络推流

  • udp视频流推送
ffmpeg -re  -i out.ts  -c copy -f mpegts udp://localhost:1935
1
  • rtmp推流
ffmpeg -re -i out.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/hello
1

# 提取音频

ffmpeg -i test.mp4 -acodec aac out.aac
ffmpeg -i out.aac -acodec mp3 out.mp3
1
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
1
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
1
2
3
4
5
6

# 视频截切

ffmpeg -ss 00:00:10 -t 00:00:20 -i test.mp4 -vcodec copy -acodec copy out2.mp4
1

# 添加水印

ffmpeg -y -i test.mp4 -i logo.jpg -filter_complex overlay out3.mp4
1

# 切割ts分片

切割ts分片 切割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
1
2

# 视频分解

ffmpeg -i test.mp4 -r 1 -f image2 ./imgs/test-%3d.jpg
1

视频分解

# 视频合并

  • 将ts视频合并为mp4视频

将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
1
2
  • 将图片合成为mp4视频
ffmpeg -f image2 -i ./imgs/test-%3d.jpg out4.mp4
1
  • 音视频合成为视频
ffmpeg -y -i test2.mp4 -i test2.mp3 -vcodec copy -acodec copy out5.mp4
1

# 信息查询

  • 查看视频信息
ffmpeg -i test2.mp4
ffprobe -i test2.mp4
1
2
  • 查看所有格式
ffmpeg -formats
1
  • 查看所有编解码器
ffmpeg -codecs
1
  • 查看所有filter
ffmpeg -filters
1
  • 查看所有图片格式
ffmpeg -pix_fmts
1
  • 查看所有像素格式
ffmpeg -sample_fmts
1

# 写在最后

以上就是有关ffmpeg的一些简单介绍、安装和方法使用。

分享至:

  • qq
  • qq空间
  • 微博
  • 豆瓣
  • 贴吧