FFmpeg交叉编译与命令
FFmpeg是全世界的音视频开发工程师都应该掌握的工具,FFmpeg是一套可以用来记录、处理数字音频、视频并将其转换为流的开源框架,提供了录制、转换以及流化音视频的完整解决方案。本篇文章主要是FFmpeg的源码本地编译(Mac与CentOS)、交叉编译(Android平台)和命令行工具的使用。
FFmpeg简介
FFmpeg作为一套音视频解决方案,不但功能丰富,而且可移植性还很强,可以用在Linux、Windows、 MacOS、Android、iOS等多种平台。至于FFmpeg的名称来源呢?其实FFmpeg名称中的mpeg来自视频编码标准MPEG,而前缀FF是Fast Forward的首字母缩写。FFmpeg处理音视频的流程简图:
1、解复用(Demux) 当FFmpeg打开一个多媒体文件之后,第一步就是解复用——Demux。一个多媒体文件既包括音频也包括视频,而且音频和视频都是分开进行压缩的,因为音频和视频的压缩算法不一样,既然压缩算法不一样,那么肯定解码也不一样,所以需要对音频和视频分别进行解码。虽然音频和视频是分开进行压缩的,但是为了传输过程的方便,将压缩过的音频和视频捆绑在一起进行传输。所以我们解码的第一步就是将这些绑在一起的音频和视频流分开来,也就是传说中的解复用,所以一句话,解复用这一步就是将文件中捆绑在一起的音频流和视频流分开来以方便后面分别对它们进行解码。
2、编解码(Decode)
一个多媒体文件肯定是经过某种或几种格式的压缩的,也就是通常所说的视频和音频编码,编码是为了减少数据量,否则的话对我们的存储设备是一个挑战,如果是流媒体的话对网络带宽也是一个几乎不可能完成的任务。所以我们必须对媒体信息进行尽可能的压缩。
FFmpeg结构概览
下面给出一个总览,大体了解一下FFmpeg的整体结构,如图所示:
默认的编译会生成4个可执行文件和8个静态库。可执行文件包括用于转码、推流、Dump媒体文件的ffmpeg、用于播放媒体文件的ffplay、 用于获取媒体文件信息的ffprobe,以及作为简单流媒体服务器的 ffserver。
8个静态库其实就是FFmpeg的8个模块,具体包括如下内容:
AVUtil:核心工具库,该模块是最基础的模块之一,许多其他模块都会依赖该库做一些基本的音视频处理操作。
AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。
AVCodec:编解码库,该模块也是最重要的模块之一,封装了 Codec层,但是有一些Codec是具备自己的License的,FFmpeg是不会默认添加像libx264、FDK-AAC、lame等库的,但是FFmpeg就像一个平台一样,可以将其他的第三方的Codec以插件的方式添加进来,然后为开发者提供统一的接口,这就是FFmpeg的强大之处了。
AVFilter:音视频滤镜库,该模块提供了包括音频特效和视频特效的处理,在使用FFmpeg的API进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便同时也非常高效的一种方式。
AVDevice:输入输出设备库,比如,需要编译出播放声音或者视频的工具ffplay,就需要确保该模块是打开的,同时也需要libSDL的预先编译,因为该设备模块播放声音与播放视频使用的都是libSDL库。
SwrRessample:该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等基本信息转换。
SWScale:该模块是将图像进行格式转换的模块,比如可以将 YUV的数据转换为RGB的数据。
PostProc:该模块可用于进行后期处理,当我们使用AVFilter的时候需要打开该模块的开关,因为Filter中会使用到该模块的一些基础函数。
FFmpeg编译
FFmpeg本地编译
下载源代码,https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2,解压后里面有个configure脚本,FFmpeg与大部分GNU软件的编译方式类似,都是通过 configure脚本来实现编译前定制的,这种方式允许用户在编译前对软件进行裁剪,同时通过对最终运行到的系统以及目标平台的配置来决定对某些模块设定合适的配置。configure脚本运行完毕之后,会生成Makefile文件,直接 make & make install 即可完成编译安装。
先来看看configure 的脚本,可以利用它的help命令来查看其到底提供了哪些选项?
1./configure --help
标准选项:GNU软件例行配置项目,例如安装路径、--prefix=...
等。
编译、链接选项:默认配置是生成静态库而不是生成动态库,例 如--disable-static
、--enable-shared
等。
可执行程序控制选项:决定是否生成FFmpeg、ffplay、ffprobe和 ffserver等。
模块控制选项:裁剪编译模块,包括整个库的裁剪,例如--disable - avdevice
;一组模块的筛选,例如–disable-decoders;单个模块的裁剪, 例如–disable-demuxer。
能力展示选项:列出当前源代码支持的各种能力集,例如--list- decoders
、--list-encoders
,下面来看看帮助选项提供了哪些内容:
1Help options:
2 --help print this message
3 --quiet Suppress showing informative output
4 --list-decoders show all available decoders
5 --list-encoders show all available encoders
6 --list-hwaccels show all available hardware accelerators
7 --list-demuxers show all available demuxers
8 --list-muxers show all available muxers
9 --list-parsers show all available parsers
10 --list-protocols show all available protocols
11 --list-bsfs show all available bitstream filters
12 --list-indevs show all available input devices
13 --list-outdevs show all available output devices
14 --list-filters show all available filters
15
16# 标准选项
17# --disable 代表关闭状态 --enable 代表开启状态
18Standard options:
19 --logfile=FILE log tests and output to FILE [ffbuild/config.log]
20 --disable-logging do not log configure debug information
21 --fatal-warnings fail if any configure warning is generated
22
23 # 最终编译好的动态静态库位置,必须设置
24 --prefix=PREFIX install in PREFIX [$prefix_default]
25
26 --bindir=DIR install binaries in DIR [PREFIX/bin]
27 --datadir=DIR install data files in DIR [PREFIX/share/ffmpeg]
28 --docdir=DIR install documentation in DIR [PREFIX/share/doc/ffmpeg]
29 --libdir=DIR install libs in DIR [PREFIX/lib]
30 --shlibdir=DIR install shared libs in DIR [LIBDIR]
31 --incdir=DIR install includes in DIR [PREFIX/include]
32 --mandir=DIR install man page in DIR [PREFIX/share/man]
33 --pkgconfigdir=DIR install pkg-config files in DIR [LIBDIR/pkgconfig]
34 --enable-rpath use rpath to allow installing libraries in paths
35 not part of the dynamic linker search path
36 use rpath when linking programs (USE WITH CARE)
37 --install-name-dir=DIR Darwin directory name for installed targets
38
39Licensing options:
40 --enable-gpl allow use of GPL code, the resulting libs
41 and binaries will be under GPL [no]
42 --enable-version3 upgrade (L)GPL to version 3 [no]
43 --enable-nonfree allow use of nonfree code, the resulting libs
44 and binaries will be unredistributable [no]
45
46Configuration options:
47# 开启静态库
48 --disable-static do not build static libraries [no]
49# 关闭动态库
50 --enable-shared build shared libraries [no
51# 可以优化库的大小
52 --enable-small optimize for size instead of speed
53 --disable-runtime-cpudetect disable detecting CPU capabilities at runtime (smaller binary)
54 --enable-gray enable full grayscale support (slower color)
55 --disable-swscale-alpha disable alpha channel support in swscale
56 --disable-all disable building components, libraries and programs
57 --disable-autodetect disable automatically detected external libraries [no]
58
59Program options:
60 --disable-programs do not build command line programs
61 # 使用FFmpeg命令
62 --disable-ffmpeg disable ffmpeg build
63 # 播放器
64 --disable-ffplay disable ffplay build
65 --disable-ffprobe disable ffprobe build
66
67Documentation options:
68 --disable-doc do not build documentation
69 --disable-htmlpages do not build HTML documentation pages
70 --disable-manpages do not build man documentation pages
71 --disable-podpages do not build POD documentation pages
72 --disable-txtpages do not build text documentation pages
73
74# 模块选项
75Component options:
76# 可以操控我们的摄像头-(Android中是不支持)
77 --disable-avdevice disable libavdevice build
78# audio video codec(编码和解码)
79 --disable-avcodec disable libavcodec build
80# 音视频格式生成和解析相关
81 --disable-avformat disable libavformat build
82# 音频重采样(如果想把单声道,变成双声道)
83 --disable-swresample disable libswresample build
84# 对视频显示相关(对视频的缩放,放大缩小)
85 --disable-swscale disable libswscale build
86# 后期处理,很少用,可以关闭掉
87 --disable-postproc disable libpostproc build
88# 给视频加水印,加字幕,特殊效果
89 --disable-avfilter disable libavfilter build
90 --enable-avresample enable libavresample build (deprecated) [no]
91 --disable-pthreads disable pthreads [autodetect]
92 --disable-w32threads disable Win32 threads [autodetect]
93 --disable-os2threads disable OS/2 threads [autodetect]
94 --disable-network disable network support [no]
95 --disable-dct disable DCT code
96 --disable-dwt disable DWT code
97 --disable-error-resilience disable error resilience code
98 --disable-lsp disable LSP code
99 --disable-lzo disable LZO decoder code
100 --disable-mdct disable MDCT code
101 --disable-rdft disable RDFT code
102 --disable-fft disable FFT code
103 --disable-faan disable floating point AAN (I)DCT code
104 --disable-pixelutils disable pixel utils in libavutil
105
106Individual component options:
107 --disable-everything disable all components listed below
108 --disable-encoder=NAME disable encoder NAME
109 --enable-encoder=NAME enable encoder NAME
110 --disable-encoders disable all encoders
111 --disable-decoder=NAME disable decoder NAME
112 --enable-decoder=NAME enable decoder NAME
113 --disable-decoders disable all decoders
114 --disable-hwaccel=NAME disable hwaccel NAME
115 --enable-hwaccel=NAME enable hwaccel NAME
116 --disable-hwaccels disable all hwaccels
117 --disable-muxer=NAME disable muxer NAME
118 --enable-muxer=NAME enable muxer NAME
119# 混合封装(音视频等于一段音频一段视频合并在一起就是.mp4,不想这样就可以关闭)
120 --disable-muxers disable all muxers
121 --disable-demuxer=NAME disable demuxer NAME
122 --enable-demuxer=NAME enable demuxer NAME
123 --disable-demuxers disable all demuxers
124 --enable-parser=NAME enable parser NAME
125 --disable-parser=NAME disable parser NAME
126 --disable-parsers disable all parsers
127 --enable-bsf=NAME enable bitstream filter NAME
128 --disable-bsf=NAME disable bitstream filter NAME
129 --disable-bsfs disable all bitstream filters
130 --enable-protocol=NAME enable protocol NAME
131 --disable-protocol=NAME disable protocol NAME
132 --disable-protocols disable all protocols
133 --enable-indev=NAME enable input device NAME
134 --disable-indev=NAME disable input device NAME
135 --disable-indevs disable input devices
136 --enable-outdev=NAME enable output device NAME
137 --disable-outdev=NAME disable output device NAME
138 --disable-outdevs disable output devices
139 --disable-devices disable all devices
140 --enable-filter=NAME enable filter NAME
141 --disable-filter=NAME disable filter NAME
142 --disable-filters disable all filters
其他:允许开发者深度定制,如交叉编译环境配置、自定义编译器参数的设定等。
MacOS 下的本地编译 >
下面开始本地编译出Mac能使用的FFmpeg:
先下载ffmpeg需要的依赖包,ffmpeg需要的依赖包几乎都可以通过brew install安装:
1brew install automake fdk-aac lame libass libtool libvorbis libvpx opencore-amr opus sdl shtool speex texi2html theora wget x264 xvid yasm
接下来执行整个编译安装过程就好了,以下命令基本上涵盖了大部分的扩展库
1./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --prefix=/usr/local
2
3sudo make && make install
CentOS7 下的本地编译 >
1# 安装基础环境
2yum -y install gcc gcc-c++ gcc automake autoconf libtool make bzip2 nasm openssl-devel
3
4# yasm
5wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
6tar -zxvf yasm-1.3.0.tar.gz
7cd yasm-1.3.0
8./configure
9make && make install
10
11# 安装x264
12wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.gz
13tar -zxvf yasm-1.3.0.tar.gz
14cd yasm-1.3.0
15./configure --prefix=/usr/x264/ --includedir=/usr/local/include --libdir=/usr/local/lib --enable-shared --disable-asm
16make && make install
17
18
19# libfdk-aac
20wget https://ftp.osuosl.org/pub/blfs/conglomeration/fdk-aac/fdk-aac-2.0.2.tar.gz
21tar -zxvf fdk-aac-2.0.2.tar.gz
22cd fdk-aac-2.0.2
23./configure
24make && make install
25
26
27# 编译ffmpeg
28./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-version3 --enable-libfdk-aac --enable-libx264 --enable-pthreads --enable-shared --enable-openssl --enable-nonfree --enable-debug --disable-optimizations
29
30chmod a+x ./ffbuild/version.sh
31chmod a+x ./ffbuild/pkgconfig_generate.sh
32make && make install
33
34# 配置库
35vim /etc/ld.so.conf
36
37# 打开后加入以下两行:
38/usr/local/ffmpeg/lib
39/usr/local/lib
40
41# 让配置生效
42ldconfig
43
44# 创建软链接
45ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/local/bin/
46ln -s /usr/local/ffmpeg/bin/ffprobe /usr/local/bin/
Windows下编译FFmpeg >
过程复杂,直接忽略。建议直接下载编译好的文件,地址如下:
https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full-shared.7z
FFmpeg交叉编译
在源码目录下编写Shell脚本,ffmpeg_build.sh,反正根据NDK目录结构写就行了,核心就是指定好对应的编译器、汇编器、打包器、链接器等配置好而已:
1#!/bin/bash
2# 当前系统
3export HOST_TAG=darwin-x86_64
4# 支持的 Android CUP 架构
5# export ARCH=aarch64
6# export CPU=arm64
7export ARCH=armv7a
8export CPU=arm-v7a
9# export ARCH=x64
10# export CPU=x86_64
11
12# 支持的 Android 最低系统版本
13export MIN=21
14export ANDROID_NDK_PLATFORM=android-21
15
16# 生成库的目录
17export PREFIX=$(pwd)/android/$CPU
18
19# NDK 根目录
20export NDK=/Users/zchanglin/AndroidDevelop/ndk/android-ndk-r21e
21
22export MIN_PLATFORM=$NDK/platforms/android-$MIN
23export SYSROOT=$NDK/sysroot
24export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
25export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
26export AS=$TOOLCHAIN/bin/arm-linux-androideabi-as
27
28# armv7a
29export CC=$TOOLCHAIN/bin/$ARCH-linux-androideabi$MIN-clang
30export CXX=$TOOLCHAIN/bin/$ARCH-linux-androideabi$MIN-clang++
31
32# arm64
33# export CC=$TOOLCHAIN/bin/aarch64-linux-android$MIN-clang
34# export CXX=$TOOLCHAIN/bin/aarch64-linux-android$MIN-clang++
35
36export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
37export NM=$TOOLCHAIN/bin/arm-linux-androideabi-nm
38export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
39export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
40
41./configure \
42 --prefix=$PREFIX \
43 --ar=$AR \
44 --as=$AS \
45 --cc=$CC \
46 --cxx=$CXX \
47 --nm=$NM \
48 --ranlib=$RANLIB \
49 --strip=$STRIP \
50 --arch=$ARCH \
51 --target-os=android \
52 --enable-cross-compile \
53 --disable-asm \
54 --enable-shared \
55 --disable-static \
56 --disable-ffprobe \
57 --disable-ffplay \
58 --disable-ffmpeg \
59 --disable-debug \
60 --disable-symver \
61 --disable-stripping \
然后执行这个脚本,接下来
1make
2make install
3
4# 如果需要编译其他平台,则只需要make clean,然后修改脚本,再次执行make & make install
5make clean
6./ffmpeg_build.sh
7make
8make install
如何添加扩展库
现在就假设已经交叉编译出了 LAME、X264、FDK-AAC的静态库与头文件(不过也必须得是交叉编译的目标平台),并且在FFmpeg的源码目录下建立了external-libs
目录,还在其中建立了LAME、X264、FDK- AAC三个目录,每个目录中的结构都包含了include和lib两个目录,并且将编译出来的头文件和静态库文件分别都放到了这两个目录下面。
新增X264编码器需要新增以下脚本:
1--enable-muxer=h264 \
2--enable-encoder=libx264 \
3--enable-libx264 \
4--extra-cflags="-Iexternal-libs/x264/include" \
5--extra-ldflags="-Lexternal-libs/x264/lib" \
新增LAME编码器需要新增以下脚本:
1--enable-muxer=mp3 \
2--enable-encoder=libmp3lame \
3--enable-libmp3lame \
4--extra-cflags="-Iexternal-libs/lame/include" \
5--extra-ldflags="-Lexternal-libs/lame/lib" \
新增FDK-AAC编码器需要新增以下脚本:
1--enable-encoder=libfdk_aac \
2--enable-libfdk_aac \
3--extra-cflags="-Iexternal-libs/fdk-aac/include" \
4--extra-ldflags="-Lexternal-libs/fdk-aac/lib" \
可以按照自己的应用场景,把需要编译进来的第三方库以修改脚本文件的方式进行编译,然后以命令行模式或者以API调用的方式进行使用。
在FFmpeg中,有一个类型的filter称为bit stream filter,要想在开发过程中使用该filter,则需要在编译的过程中打开它。该filter存在的意义 主要是应对某些格式的封装转换行为。比如AAC编码,常见的有两种封装格式:一种是ADTS格式的流,是AAC定义在MPEG2里面的格式;另外一种是封装在MPEG4里面的格式,这种格式会在每一帧前面拼接一个用声道、采样率等信息组成的头。开发者完全可以手动拼接该头信息,即将AAC编码器输出的原始码流(ADTS头+ES流)封装进MP4、 FLV或者MOV等格式的容器中时,需要先将ADTS头转换为MPEG-4 AudioSpecficConfig(描述了编码器的配置参数)头,并去掉原始码流中的ADTS头(只剩下ES流)。但是使用FFmpeg提供好的aac_adtstoasc类型的bit stream filter可以非常方便地进行转换,FFmpeg为开发者隐藏了实现的细节,并且提供了更好的代码可读性。若想要正常使用这个 filter,则需要在编译过程中打开下面这个选项:
1--enable-bsf=aac_adtstoasc
AAC的bit stream filter常常应用在编码的过程中。与音频的AAC编码格式相对应的是视频中的H264编码,它也有两种封装格式:一种是 MP4封装的格式;一种是裸的H264格式(一般称为annexb封装格式)。 FFmpeg中也提供了对应的bit stream filter,称为H264_mp4toannexb,可以将MP4封装格式的H264数据包转换为annexb封装格式的H264数据 (其实就是裸的H264的数据)包。如果要使用它也只需要在编译过程中打开下面这个选项即可:
1--enable-bsf=h264_mp4toannexb
H264的bit stream filter常常应用于视频解码过程中,特别是在各个平台上提供的硬件解码器时,一定会用到该bit stream filter。
如何达到最小的包体积
为了达到最小的包体积,需要先关掉所有的模块,然后再打开具体的编解码器、解析器、解复用器、协议等等,总之就是只编译出自己需要用的即可。另外还可以关闭命令行工具与帮助文档、输入输出设备、动态库生成,同时还打开了静态库的生成:
1CONFIGURE_FLAGS=
2 --disable-shared \
3 --enable-static \
4 --disable-stripping \
5 --disable-ffmpeg \
6 --disable-ffplay \
7 --disable-ffserver \
8 --disable-ffprobe \
9 --disable-avdevice \
10 --disable-devices \
11 --disable-indevs \
12 --disable-outdevs \
13 --disable-debug \
14 --disable-asm \
15 --disable-yasm \
16 --disable-doc \
17 --enable-small \
18 --enable-dct \
19 --enable-dwt \
20 --enable-lsp \
21 --enable-mdct \
22 --enable-rdft \
23 --enable-fft \
24 --enable-version3 \
25 --enable-nonfree \
26 --disable-filters \
27 --disable-postproc \
28 --disable-bsfs \
29 --enable-bsf=aac_adtstoasc \
30 --enable-bsf=h264_mp4toannexb \
31 --disable-encoders \
32 --enable-encoder=pcm_s16le \
33 --enable-encoder=aac \ --enable-encoder=libvo_aacenc \
34 --disable-decoders \ --enable-decoder=aac \
35 --enable-decoder=mp3 \
36 --enable-decoder=pcm_s16le \
37 --disable-parsers \
38 --enable-parser=aac \
39 --disable-muxers \
40 --enable-muxer=flv \
41 --enable-muxer=wav \
42 --enable-muxer=adts \
43 --disable-demuxers \
44 --enable-demuxer=flv \
45 --enable-demuxer=wav \
46 --enable-demuxer=aac \
47 --disable-protocols \
48 --enable-protocol=rtmp \
49 --enable-protocol=file \
50 --enable-libfdk_aac \
51 --enable-libx264 \
52 --enable-cross-compile \
53 --prefix=$INSTALL_DIR
FFmpeg命令行工具
FFmpeg命令有很多,但基本上都可以分为以下8类:
基本信息查询命令
录制命令
录制屏幕:
1ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-
-f: 是指使用 Mac 下的 avfoundation 库采集数据
-
-i: 指的是输入是什么,1 代表的是屏幕设备的索引值,类似于文件描述符,摄像头是 0
-
-r: 指定帧率
avfoundation 是MacOS用于采集音视频的库,下面来查询avfoundation 所支持的设备列表:
1ffmpeg -f avfoundation -list_devices true -i ""
播放录制的视频,在录制的时候我们就知道了录制的源、格式以及分辨率
录制的格式是yuv,这是一种原始数据流,不包含视频的任何头信息,所以注意如果是 yuv 视频,必须是告诉 ffplay 宽高和帧率才可以播放,参数是开始录制时 ffmpeg 的提示内容:
1ffplay -s 2688x1688 -pix_fmt uyvy422 out.yuv
录制音频
1ffmpeg -f avfoundation -i :0 out.wav
播放声音
1ffplay out.wav
分解/复用命令
视频相关可以用这个mp4做测试(从BiliBili下载的《猫和老鼠》动画片):
1、mp4 -> flv
1ffmpeg -i test.mp4 -vcodec copy -acodec copy test.flv
- -i :输入文件
- -vcodec copy: 视频编码处理方式
- -acodec copy: 音频编码处理方式
2、抽取出视频
1ffmpeg -i test.mp4 -an -vcodec copy out.h264
播放抽取出的视频
1ffplay out.h264
3、抽取出音频
1ffmpeg -i test.mp4 -acodec copy -vn out.aac
播放抽取出的音频
1ffplay out.aac
处理原始数据命令
原始数据就是 ffmpeg 解码后的数据,对于视频就是 yuv 数据,对于音频就是 pcm 数据:
1ffmpeg -i test.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
-
-an 表示不带音频数据
-
-c:v 表示对视频进行编码,使用 rawvideo 编码
-
-pix_fmt 原始数据必须制定像素格式,yuv 4:2:0,是常用的像素格式
播放输出的yuv数据
1ffplay -s 640x480 -pix_fmt yuv420p out.yuv
抽取视频中的原始音频数据
1ffmpeg -i test.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
- -vn 表示不要视频数据
- -ar: 视频采样率
- -ac2: 双声道
- -f:数据存储格式
播放输出的音频数据
1ffplay -ar 44100 -ac 2 -f s16le out.pcm
滤镜命令
1、视频裁剪
1ffmpeg -i test.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
- -vf 视频滤镜 crop
后面是 crop 滤镜的参数
-
in_w 视频宽度-200
-
in_h 视频高度-200
-
-c:v 视频编码器 libx264
-
-c:a copy 不对音频做特殊处理
2、视频添加图片/文字水印
1、添加图片水印:
1ffmpeg -i test.mp4 -vf "movie=google.png[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] " output.mp4
- -vf:视频滤镜,视频裁剪,水印等等操作都需要它完成
- google.png:要添加的水印图片地址
- overlay:水印参数
main_w-overlay_w-10
: 水印在x轴的位置,也可以写成x=main_w-overlay_w-10
,main_h-overlay_h-10
:水印在y轴的位置
2、在视频右下角的添加图片水印:
1ffmpeg -i test.mp4 -i google.png -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' output.mp4
3、在视频左下角添加图片水印
1ffmpeg -i test.mp4 -i google.png -filter_complex 'overlay=x=10:y=main_h-overlay_h-10' output.mp4
- -filter_complex: 相比-vf, filter_complex适合开发复杂的滤镜功能,如同时对视频进行裁剪并旋转。参数之间使用逗号(,)隔开即可
- main_w:视频宽度
- overlay_w:要添加的图片水印宽度
- main_h : 视频高度
- overlay_h:要添加的图片水印宽度
4、添加文字水印
1ffmpeg -i test.mp4 -vf "drawtext=fontfile=simhei.ttf: text=《猫和老鼠经典版》:x=10:y=10:fontsize=24:fontcolor=white:shadowy=2" output.mp4
- fontfile:字体类型
- text:要添加的文字内容
- fontsize:字体大小
- fontcolor:字体颜色
裁剪与合并命令
1、裁剪视频
1ffmpeg -i test.mp4 -ss 00:00:00 -t 10 out.mp4
从 00:00:00 起始裁剪 10 秒,输出到 out.mp4
2、合并命令
1ffmpeg -f concat -i inputs.txt out.flv
-
-f concat 拼接
-
-i 后的参数是需要拼接的文件列表 inputs.txt 记录的是所有要拼接的视频列表,比如inputs.txt 里的内容为:
图片/视频互转命令
1、视频转图片
1ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg
- -r 每秒钟转换帧率
- -f 表示将输入文件转成什么格式,image2 表示一种图片格式
- -%3d 表示由3个数字组成
2、图片转视频
1ffmpeg -i image-%3d.jpeg out.mp4
直播相关命令
1、直播推流
1ffmpeg -re -i test.mp4 -c copy -f mp4 rtmp://server/live/streamName
- -re 减慢帧率速度,对于直播流来说让帧率与真正的帧率保持同步
- -i 多媒体文件
- -c 音视频编解码(音频 -a 视频 -v) copy
- -f 指定推出去的文件格式 flv
2、直播拉流
1ffmpeg -i rtmp://server/live/streamName -c copy out.mp4
主要对FFmpeg进行了介绍,还有FFmpeg的本地编译和交叉编译,最后简略的了解了一些FFmpeg的常用命令。