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下载的《猫和老鼠》动画片):

https://img.zouchanglin.cn/test.mp4

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-10main_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 里的内容为:

    1file '1.mp4'
    2file '2.mp4'
    3file '3.mp4'
    

图片/视频互转命令

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的常用命令。