Windows10使用MSYS2和VS2019编译FFmpeg详解

1 环境准备

1.1 安装Visual Studio 2019

这个步骤相对比较简单,不再详细说明。

1.2 安装msys2

首先需要安装msys2环境以及相关的编译依赖项, 官方网址为:

https://www.msys2.org/

在官网下载好 安装程序后,直接按照提示安装即可。

安装好后需要将下载库的地址更换为国内源,否则下载速度可能会极慢,甚至失败。配置文件位于:C:\msys64\etc\pacman.d,分别将mirrorlist.mingw32、mirrorlist.mingw64、mirrorlist.msys三个配置文件的首选Server的地址,更换为清华大学及中科大镜像

复制代码
# See https://www.msys2.org/dev/mirrors

## Primary
## 清华大学
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686/
## 中科大
Server = https://mirrors.ustc.edu.cn/msys2/mingw/i686/

Server = https://mirror.msys2.org/mingw/i686/
Server = https://repo.msys2.org/mingw/i686/

## Tier 1
Server = https://mirror.umd.edu/msys2/mingw/i686/
Server = https://mirror.yandex.ru/mirrors/msys2/mingw/i686/
Server = https://download.nus.edu.sg/mirror/msys2/mingw/i686/
Server = https://mirror.accum.se/mirror/msys2.org/mingw/i686/
Server = https://ftp.nluug.nl/pub/os/windows/msys2/builds/mingw/i686/
Server = https://ftp.osuosl.org/pub/msys2/mingw/i686/
Server = https://mirror.internet.asn.au/pub/msys2/mingw/i686/
Server = https://mirror.selfnet.de/msys2/mingw/i686/
Server = https://mirrors.dotsrc.org/msys2/mingw/i686/
Server = https://mirrors.bfsu.edu.cn/msys2/mingw/i686/
Server = https://mirror.nju.edu.cn/msys2/mingw/i686/
Server = https://repo.extreme-ix.org/msys2/mingw/i686/
Server = https://mirror.clarkson.edu/msys2/mingw/i686/
Server = https://quantum-mirror.hu/mirrors/pub/msys2/mingw/i686/
Server = https://mirror.archlinux.tw/MSYS2/mingw/i686/
Server = https://fastmirror.pp.ua/msys2/mingw/i686/

## Tier 2
Server = https://ftp.cc.uoc.gr/mirrors/msys2/mingw/i686/
Server = https://mirror.jmu.edu/pub/msys2/mingw/i686/
Server = https://mirrors.piconets.webwerks.in/msys2-mirror/mingw/i686/
Server = https://www2.futureware.at/~nickoe/msys2-mirror/mingw/i686/
Server = https://mirrors.sjtug.sjtu.edu.cn/msys2/mingw/i686/
Server = https://mirrors.bit.edu.cn/msys2/mingw/i686/
Server = https://mirrors.aliyun.com/msys2/mingw/i686/
Server = https://mirror.iscas.ac.cn/msys2/mingw/i686/
Server = https://mirrors.cloud.tencent.com/msys2/mingw/i686/

mirrorlist.mingw32

复制代码
# See https://www.msys2.org/dev/mirrors

## Primary
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64/
Server = https://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
Server = https://mirror.msys2.org/mingw/x86_64/
Server = https://repo.msys2.org/mingw/x86_64/

## Tier 1
Server = https://mirror.umd.edu/msys2/mingw/x86_64/
Server = https://mirror.yandex.ru/mirrors/msys2/mingw/x86_64/
Server = https://download.nus.edu.sg/mirror/msys2/mingw/x86_64/
Server = https://mirror.accum.se/mirror/msys2.org/mingw/x86_64/
Server = https://ftp.nluug.nl/pub/os/windows/msys2/builds/mingw/x86_64/
Server = https://ftp.osuosl.org/pub/msys2/mingw/x86_64/
Server = https://mirror.internet.asn.au/pub/msys2/mingw/x86_64/
Server = https://mirror.selfnet.de/msys2/mingw/x86_64/
Server = https://mirrors.dotsrc.org/msys2/mingw/x86_64/
Server = https://mirrors.bfsu.edu.cn/msys2/mingw/x86_64/
Server = https://mirror.nju.edu.cn/msys2/mingw/x86_64/
Server = https://repo.extreme-ix.org/msys2/mingw/x86_64/
Server = https://mirror.clarkson.edu/msys2/mingw/x86_64/
Server = https://quantum-mirror.hu/mirrors/pub/msys2/mingw/x86_64/
Server = https://mirror.archlinux.tw/MSYS2/mingw/x86_64/
Server = https://fastmirror.pp.ua/msys2/mingw/x86_64/

## Tier 2
Server = https://ftp.cc.uoc.gr/mirrors/msys2/mingw/x86_64/
Server = https://mirror.jmu.edu/pub/msys2/mingw/x86_64/
Server = https://mirrors.piconets.webwerks.in/msys2-mirror/mingw/x86_64/
Server = https://www2.futureware.at/~nickoe/msys2-mirror/mingw/x86_64/
Server = https://mirrors.sjtug.sjtu.edu.cn/msys2/mingw/x86_64/
Server = https://mirrors.bit.edu.cn/msys2/mingw/x86_64/
Server = https://mirrors.aliyun.com/msys2/mingw/x86_64/
Server = https://mirror.iscas.ac.cn/msys2/mingw/x86_64/
Server = https://mirrors.cloud.tencent.com/msys2/mingw/x86_64/

mirrorlist.mingw64

复制代码
# See https://www.msys2.org/dev/mirrors

## Primary
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch/
Server = https://mirrors.ustc.edu.cn/msys2/msys/$arch/
Server = https://mirror.msys2.org/msys/$arch/
Server = https://repo.msys2.org/msys/$arch/

## Tier 1
Server = https://mirror.umd.edu/msys2/msys/$arch/
Server = https://mirror.yandex.ru/mirrors/msys2/msys/$arch/
Server = https://download.nus.edu.sg/mirror/msys2/msys/$arch/
Server = https://mirror.accum.se/mirror/msys2.org/msys/$arch/
Server = https://ftp.nluug.nl/pub/os/windows/msys2/builds/msys/$arch/
Server = https://ftp.osuosl.org/pub/msys2/msys/$arch/
Server = https://mirror.internet.asn.au/pub/msys2/msys/$arch/
Server = https://mirror.selfnet.de/msys2/msys/$arch/
Server = https://mirrors.dotsrc.org/msys2/msys/$arch/
Server = https://mirrors.bfsu.edu.cn/msys2/msys/$arch/
Server = https://mirror.nju.edu.cn/msys2/msys/$arch/
Server = https://repo.extreme-ix.org/msys2/msys/$arch/
Server = https://mirror.clarkson.edu/msys2/msys/$arch/
Server = https://quantum-mirror.hu/mirrors/pub/msys2/msys/$arch/
Server = https://mirror.archlinux.tw/MSYS2/msys/$arch/
Server = https://fastmirror.pp.ua/msys2/msys/$arch/

## Tier 2
Server = https://ftp.cc.uoc.gr/mirrors/msys2/msys/$arch/
Server = https://mirror.jmu.edu/pub/msys2/msys/$arch/
Server = https://mirrors.piconets.webwerks.in/msys2-mirror/msys/$arch/
Server = https://www2.futureware.at/~nickoe/msys2-mirror/msys/$arch/
Server = https://mirrors.sjtug.sjtu.edu.cn/msys2/msys/$arch/
Server = https://mirrors.bit.edu.cn/msys2/msys/$arch/
Server = https://mirrors.aliyun.com/msys2/msys/$arch/
Server = https://mirror.iscas.ac.cn/msys2/msys/$arch/
Server = https://mirrors.cloud.tencent.com/msys2/msys/$arch/

mirrorlist.msys

运行C:\msys64\msys2.exe,在命令行通过 pacman -Syu 一键安装和升级所有的库。

在编译过程中可能会遇到还缺少某些其他库的问题, 直接根据提示安装就可以。比如可能还需要安装的库如下:

复制代码
pacman -S make cmake          #常规编译工具
pacman -S yasm              #汇编工具
pacman -S nasm              #汇编工具
pacman -S pkg-config          #库配置工具,编译支持x264和x265会用到
pacman -S mingw-w64-x86_64-gcc    #编译工具
pacman -S diffutils           #比较工具,ffmpeg configure 生成makefile时用到
pacman -S git               #源码下载工具

1.3 配置VC环境

首先,为了使msys2访问windows PATH环境变量,需要在msys2安装目录中找到脚本文件msys2_shell.cmd,使用任何编辑器将其打开,将rem set MSYS2_PATH_TYPE=inherit修改为set MSYS2_PATH_TYPE=inherit,即删除rem注释继承系统环境变量。

其次,在windows开始菜单中找到Visual Studio 2019,右击"x64_x86 Cross Tools Command Prompt For VS 2019",选择以管理员身份运行(最好以管理员权限运行,否则后续在执行make install 指令时可能会发生权限不足的问题,切记)。

关于几个选项的选择

如果是32位Windows, 想编译32位的FFmpeg, 建议选择:x86 Native Tools Command Prompt;

如果是64位Windows, 想编译64位的FFmpeg, 建议选择:x64 Native Tools Command Prompt

如果是32位Windows, 想编译64位的FFmpeg, 建议选择:x86_x64 Cross Tools Command Prompt

如果是64位Windows, 想编译32位的FFmpeg, 建议选择:x64_x86 Cross Tools Command Prompt

具体请参见微软官网:Use the Microsoft C++ toolset from the command line

我的操作系统是Win10 64位,需要编译的是32位的FFmpeg,所以选择的是:x64_x86 Cross Tools Command Prompt For VS 2019

然后,cd到C:\msys64,32位方式运行msys2_shell.cmd(msys2_shell.cmd -mingw64会以64位方式运行msys2),启用MinGW运行环境,此时在弹出的msys2命令窗口中输入cl,输出MSVC信息,则说明编译器配置成功。

在msys窗口中分别输入which cl和which link查看当前编译器和链接器的位置:

可以看到cl编译器的位置是正确的,link链接器的位置是不正确的,这是因为目前找到的链接器默认为MSYS的链接器,MSYS默认也携带了一个名为link.exe的链接器(在:msys安装目录/usr/bin/link.exe),它与Visual Studio 自带的link.exe发生了冲突,这会影响之后构建系统的构建(在我的编译过程中就是因为忽略了这个问题,导致编译过程异常缓慢,而且生成的dll文件无法使用),我们这里一定要确定使用的是Visual Studio自带的link.exe。找到MSYS自带的link.exe, 将它改成别的名字,比如我将其重命名为link.exe_back。再次输入which link:

可以看到link.exe已经为Visual Studio目录下link.exe。

2 FFMPEG编译

2.1 源码下载

源码可以由https://github.com/FFmpeg/FFmpeg/tagsFFmpeg官网下载,如本人下载的是最新版的4.3版本。

2.2 编译依赖库

2.2.1 编译SDL

首先从github上获取SDL源码,命令如下:

复制代码
git clone https://github.com/libsdl-org/SDL.git
cd SDL
git checkout release-2.30.0

需要注意的是,SDL现在已经发布了3.0版本,而ffmpeg目前只能用SDL2版本,所以在拉取代码后,需要切换到2.30.0这个版本。

下载好 SDL2 源码后,我们需要使用 CMake 为其生成VS工程,所以我们首先到这里下载CMake,并将其安装到Windows系统上。之后打开 CMake-GUI,在 CMake-GUI 中指定SDL2源码所在路径以及编译后的输出路径,随后执行Configure,随后配置如下

随后保持默认配置,Generate VS2019工程。

有了VS工程,可以通过VS2019来编译SDL了。编译好的SDL会保存到指定输出目录的Release或Debug目录下,而我们希望输出的路径则是/usr/local/sdl2/lib,需要在指定输出目录下创建 lib 目录,并将SDL2.lib和SDL2.dll文件拷贝到lib目录下。同时在lib目录下创建 pkgconfig目录,将sdl2.pc文件拷贝到该目录中。此外,我们还要修改 sdl2.pc 中的内容,将其中的库路径修改为指定的输出路径,最终完整的目录结构如下所示:

2.2.2 编译x264

与SDL一样我们也要先获取其源码,可以通过下面的命令获取x264源码:

复制代码
git clone https://code.videolan.org/videolan/x264.git

源码获取到后,可以直接在MSYS2环境下编译出Windows下可用的动态库,具体步骤如下:

复制代码
cd x264                             # 在MSYS2中进入x264源码目录
pacman -S automake autoconf libtool # 安装生成Makefile的工具
CC=cl ./configure --prefix=/usr/local/x264 --enable-shared
make -j 4 && make install

通过上面的命令就可以将x264编译出来了。x264编译好后,其输出的目录结构与SDL2是一样的,在/usr/local/x264中包括了include、lib、bin等目录。要特别强调的一点是,我们需要将lib目录下的libx264.dll.lib文件名修改为libx264.lib,否则ffmpeg编译时会报 "无法找到该库" 的错误。

2.2.3 编译fdk-aac

fdk-aac的编译与SDL类似,它同样要使用CMake生成VS工程文件,之后再通过VS编译该库。首先,通下面的的命令获取fdk-aac源码:

复制代码
git clone https://github.com/mstorsjo/fdk-aac.git

之后,通过CMake生成VS工程文件,具体执行步骤请参考 SDL 生成 VS 工程的步骤,这里就不再重复了。

接下来,使用VS2019编译fdk-aac,编译好的库同要会被放到Release或Debug目录下,因此我们必须像处理SDL库一样,需要手工组织fdk-aac的输出目录树。至此fdk-aac就算编译好了。

在编译fdk-aac时有个特殊情况,就是使用CMake的方式无法产生include头文件(这也有可能是我哪块执行的不对)。为了解决这个问题,又用MSYS2+mingw的方式重新编译了一遍fdk-aac,这种方式是可以生成include头文件的,然后将生成的头文件手动拷贝到了/usr/local/fdk-aac目录下即可。

复制代码
./autogen.sh
./configure --prefix=/c/work/Opensource/ffmpegbuild/fdk-aac/migwbuild
make
make install

2.2.4 编译x265

首先下载x265源码

复制代码
git clone https://github.com/videolan/x265.git

查询VS2019 cmake路径查询VS2019 cmake路径,执行whereis cmake

编辑文件/c/work/Opensource/ffmpegbuild/x265/build/msys-cl/make-Makefiles.sh,修改其中cmake.exe为VC版绝对路径,否则会使用默认msys2中的cmake,即将:

复制代码
cmake -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4"  ../../source

修改为:

复制代码
/c/"Program Files (x86)/Microsoft Visual Studio/2019"/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin/cmake -G "NMake Makefiles" -DCMAKE_CXX_FLAGS="-DWIN32 -D_WINDOWS -W4 -GR -EHsc" -DCMAKE_C_FLAGS="-DWIN32 -D_WINDOWS -W4"  ../../source

进入源码目录,执行以下3个命令完成编译

复制代码
cd /home/source/x265/build/msys-cl/
./make-Makefiles.sh
nmake install

执行nmake install之后可见x265被编译至C:/Program Files (x86)/x265/目录,我们需要将其复制至msys2的/usr/local/目录,并修改相应的x256.pc文件中的路径

2.2.5 ffmpeg使用编译好的库

首先,我们要设置环境变量PKG_CONFIG_PATH,通过它告诉FFmpeg上述几个库从哪儿可以找到,具体的设置方法如下:

在msys2窗口运行命令pacman -S vim,安装vim,vim ~/.bashrc编辑该文件,在~/.bashrc中设置环境变量

复制代码
export PKG_CONFIG_PATH=/usr/local/sdl2/lib/pkgconfig:/usr/local/x264/lib/pkgconfig:/usr/local/fdk-aac/lib/pkgconfig:/usr/local/x265/lib/pkgconfig:$PKG_CONFIG_PATH

然后执行命令source ~/.bashrc让环境变量生效。四个库pkgconfig配置文件内容如下:

复制代码
# sdl pkg-config source file

prefix=/usr/local/sdl2
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: sdl2
Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
Version: 2.30.0
Requires.private: 
Conflicts:
Libs: -L${libdir}   -lSDL2 
Libs.private:  -lSDL2-static  -lkernel32 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lversion -luuid -ladvapi32 -lsetupapi -lshell32 -ldinput8
Cflags: -I${includedir} -I${includedir}/SDL2 

sdl2.pc

复制代码
prefix=/usr/local/x264
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: x264
Description: H.264 (MPEG4 AVC) encoder library
Version: 0.164.3191
Libs: -L${exec_prefix}/lib -llibx264 
Libs.private: 
Cflags: -I${prefix}/include -DX264_API_IMPORTS

x264.pc

复制代码
prefix=/usr/local/fdk-aac
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: Fraunhofer FDK AAC Codec Library
Description: AAC codec library
Version: 2.0.3
Libs: -L${libdir} -lfdk-aac 
Libs.private: -lm 
Cflags: -I${includedir}

fdk-aac.pc

复制代码
prefix=/usr/local/x265
exec_prefix=${prefix}/bin
libdir=${prefix}/lib
includedir=${prefix}/include

Name: x265
Description: H.265/HEVC video encoder
Version: 3.4
Libs: -L${libdir} -llibx265
Libs.private: 
Cflags: -I${includedir}

x265.pc

2.3 编译ffmpeg

进入到ffmpeg源码解压目录,执行./configure --help即可查看所有支持的编译参数:

可以看到,原生支持的编译参数有很多,我们这里只关注下列部分,通过对下列参数的配置即可完成裁剪功能。

复制代码
Individual component options:
--disable-everything     禁用下方的所有组件
--disable-encoder=NAME   禁用指定的编码器
--enable-encoder=NAME    启用指定的编码器
--disable-encoders       禁用所有编码器
--disable-decoder=NAME   禁用指定的解码器
--enable-decoder=NAME    启用指定的解码器
--disable-decoders       禁用所有解码器
--disable-hwaccel=NAME   禁用硬件加速(硬件解码)
--enable-hwaccel=NAME    启用硬件加速
--disable-hwaccels       禁用所有硬件加速
--disable-muxer=NAME     禁用指定的封装器
--enable-muxer=NAME      启用指定的封装器
--disable-muxers         禁用所有封装器
--disable-demuxer=NAME   禁用指定的解封装器
--enable-demuxer=NAME    启用指定的封装器
--disable-demuxers       禁用所有解封装器
--enable-parser=NAME     启用指定的解析器
--disable-parser=NAME    禁用指定的解析器
--disable-parsers        禁用所有的解析器
--enable-bsf=NAME        启用指定的比特流过滤器(bitstream filter)
--disable-bsf=NAME       禁用指定的比特流过滤器
--disable-bsfs           禁用所有比特流过滤器
--enable-protocol=NAME   启用指定的协议(这里的协议就是TCP/UDP/FILE)
--disable-protocol=NAME  禁用指定的协议
--disable-protocols      禁用所有的协议
--enable-indev=NAME      启用指定的输入设备
--disable-indev=NAME     禁用指定的输入设备
--disable-indevs         禁用所有的输入设备
--enable-outdev=NAME     启用指定的输出设备
--disable-outdev=NAME    禁用指定的输出设备
--disable-outdevs        禁用所有输出设备
--disable-devices        禁用所有设备
--enable-filter=NAME     启用指定的过滤器
--disable-filter=NAME    禁用指定的过滤器
--disable-filters        禁用所有过滤器

简单介绍一下上面的几个选项:

  • encoder: 对应的就是编码器,比如需要将mp3格式转换成aac格式,在转换后就必然会用到aac格式的编码器;
  • decoder: 对应的就是解码器,同上,如果要转换成aac格式,就必须先要将mp3格式进行解码,这就会用到mp3格式的解码器。
  • muxer: 对应的就是封装器,主要用于生成最终的封装格式,不同的音视频格式都有其固定的文件内容格式,方便播放器对其进行识别和解析。
  • demuxer: 对应的就是解封装器,比如一个MP4封装格式可以同时容纳H264编码格式的视频和AAC编码格式的音频,如果要取出其中的音频,就需要根据一定的规则去查找音频所在的流。
  • protocol: 文件协议,FFmpeg 不仅可以支持本地音视频文件的读取和写入,也可以支持网络流媒体的读取和写入,比如你想在本地观看一个网络电视,那么你可以在FFmpeg中传入这个网络电视的http/rtsp/rtmp地址,这样就可以实现本地播放了。
  • parser: 解析并填充内部数据结构,如:AVCodecParser, 这个和decoder 一般是搭配使用的。

这里列出的是一些常用的编译选项,完整的编译选项请参考:附录一:《FFmpeg 编译参数总结》。

本人在编译时使用如下编译选项:

复制代码
./configure --prefix=./buildout --toolchain=msvc --disable-doc --enable-shared --enable-libx264 --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libx265 --enable-ffplay  --disable-debug

其中增加最后一个配置选项--disable-debug,是因为在没有这个选项的情况下,编译会卡死在生成avcodec.dll库时,提示"正在创建库 libavcodec/avcodec.lib 和对象 libavcodec/avcodec.exp",该文章也遇到这个问题,但是微软官方也没有给出解决方案,不清楚是不是只有在特定版本的VS2019(本人为community版本)中才能复现该问题,所以暂时增加--disable-debug取消调试信息生成。

之后执行make命令进行编译。在编译过程中,假如出现如下错误[error C2065: "slib": 未声明的标识符]:

那么需要修改fftools/cmdutils.c源码文件, 将第1153行注释掉,原因是CC_IDENT标识未定义引起的, 如下所示:

后续编译过程中遇见类似的编译错误,请按相同办法处理。编译完成后执行make install,将会将可执行程序、库文件、头文件等安装到指定目录。

至此编译完成,后续会介绍通过vcpkg直接安装ffmpeg的方法以及一个基于ffmpeg的简单播放器实例。

附录一:FFmpeg 编译参数汇总

1.1 Help options 帮助选项

参数 参数作用
--help 打印显示帮助信息
--quiet 禁止显示信息输出
--list-decoders 显示所有可用的解码器
--list-encoders 显示所有可用的编码器
--list-hwaccels 显示所有可用的硬件加速器
--list-demuxers 显示所有可用的解复用器
--list-muxers 显示所有可用的复用器
--list-parsers 显示所有可用的解析器
--list-protocols 显示所有可用的协议
--list-bsfs 显示所有可用的比特流过滤器
--list-indevs 显示所有可用的输入设备
--list-outdevs 显示所有可用的输出设备
--list-filters 显示所有可用的过滤器

1.2 Standard options 标准选项

参数 参数作用
--logfile=FILE 记录测试并输出到 指定文件FILE ,默认为ffbuild/config.log
--disable-logging 不记录配置调试信息
--fatal-warnings 如果生成任何配置警告,则失败
--prefix=PREFIX 安装在指定路径PREFIX,默认为/usr/local
--bindir=DIR 在指定路径DIR 中安装二进制文件,默认为PREFIX/bin
--datadir=DIR 在指定路径DIR中安装数据文件,默认为PREFIX/share/ffmpeg
--docdir=DIR 在指定路径DIR中安装文档,默认为PREFIX/share/doc/ffmpeg
--libdir=DIR 在指定路径安装库,默认为PREFIX/lib
--shlibdir=DIR 在指定路径安装共享库,默认为LIBDIR,即PREFIX/lib
--incdir=DIR 在指定路径安装包含文件,默认为PREFIX/include
--mandir=DIR 在指定路径安装手册页,默认为PREFIX/share/man
--pkgconfigdir=DIR 在指定路径安装pkg-config 文件,默认为LIBDIR/pkgconfig
--enable-rpath 使用rpath允许在不属于动态链接器搜索路径的路径中安装库链接程序时使用rpath(小心使用)
--install-name-dir=DIR Darwin 已安装目标的目录名称

1.3 Licensing options 证书选项

参数 参数作用
--enable-gpl 允许使用GPL代码,编译的库和二进制文件处于GPL许可下,默认为否
--enable-version3 升级(L)GPL到版本3,默认为否
--enable-nonfree 允许使用非自由代码,并且二进制文件将不可再分发,默认为否

1.4 Configuration options 配置选项

参数 参数作用
--disable-static 不构建静态库,默认为否
--enable-shared 构建共享动态库,默认为否
--enable-small 优化大小而不是速度
--disable-runtime-cpudetect 禁用在运行时检测 CPU 功能(较小的二进制文件)
--enable-gray 启用全灰度支持(较慢的颜色)
--disable-swscale-alpha 在 swscale 中禁用 alpha 通道支持
--disable-all 禁用构建组件、库和程序
--disable-autodetect 禁用自动检测到的外部库,默认为否

1.5 Program options 程序选项

参数 参数作用
--disable-programs 不构建命令行程序
--disable-ffmpeg 禁用 ffmpeg 构建
--disable-ffplay 禁用 ffplay 构建
--disable-ffprobe 禁用 ffprobe 构建

1.6 Documentation options 文档选项

参数 参数作用
--disable-doc 不构建文档
--disable-htmlpages 不构建 HTML 文档页面
--disable-manpages 不构建手册文档页面
--disable-podpages 不构建 POD 文档页面
--disable-txtpages 不构建文本文档页面

1.7 Component options 组件选项

参数 参数作用
--disable-avdevice 禁用 libavdevice 构建
--disable-avcodec 禁用 libavcodec 构建
--disable-avformat 禁用 libavformat 构建
--disable-swresample 禁用 libswresample 构建
--disable-swscale 禁用 libswscale 构建
--disable-postproc 禁用 libpostproc 构建
--disable-avfilter 禁用 libavfilter 构建
--enable-avresample 启用 libavresample 构建(已弃用),默认为否
--disable-pthreads 禁用 pthreads [自动检测]
--disable-w32threads 禁用 Win32 线程 [自动检测]
--disable-os2threads 禁用 OS/2 线程 [自动检测]
--disable-network 禁用网络支持 ,默认为否
--disable-dct 禁用 DCT 代码
--disable-dwt 禁用 DWT 代码
--disable-error-resilience 禁用错误恢复代码
--disable-lsp 禁用 LSP 代码
--disable-lzo 禁用 LZO 解码器代码
--disable-mdct 禁用 MDCT 代码
--disable-rdft 禁用 RDFT 代码
--disable-fft 禁用 FFT 代码
--disable-faan 禁用浮点 AAN (I)DCT 代码
--disable-pixelutils 在 libavutil 中禁用像素工具

1.8 Individual component options 独立组件选项

参数 参数作用
--disable-everything 禁用下面列出的所有组件
--disable-encoder=NAME 禁用指定NAME的编码器
--enable-encoder=NAME 启用指定NAME的编码器
--disable-encoders 禁用所有编码器
--disable-decoder=NAME 禁用指定NAME的解码器
--enable-decoder=NAME 启用指定NAME的解码器
--disable-decoders 禁用所有解码器
--disable-hwaccel=NAME 禁用指定NAME的硬件
--enable-hwaccel=NAME 启用指定NAME的硬件
--disable-hwaccels 禁用所有 hwaccels
--disable-muxer=NAME 禁用指定NAME的复用器
--enable-muxer=NAME 启用指定NAME的复用器
--disable-muxers 禁用所有复用器
--disable-demuxer=NAME 禁用指定NAME的解复用器
--enable-demuxer=NAME 启用指定NAME的解复用器
--disable-demuxers 禁用所有解复用器
--enable-parser=NAME 启用指定NAME的解析器
--disable-parser=NAME 禁用指定NAME的解析器
--disable-parsers 禁用所有解析器
--enable-bsf=NAME 启用指定NAME的比特流过滤器
--disable-bsf=NAME 禁用指定NAME的比特流过滤器
--disable-bsfs 禁用所有比特流过滤器
--enable-protocol=NAME 启用指定NAME协议
--disable-protocol=NAME 禁用指定NAME协议
--disable-protocols 禁用所有协议
--enable-indev=NAME 启用指定NAME的输入设备
--disable-indev=NAME 禁用指定NAME的输入设备
--disable-indevs 禁用输入设备
--enable-outdev=NAME 启用指定NAME的输出设备
--disable-outdev=NAME 禁用指定NAME的输出设备
--disable-outdevs 禁用输出设备
--disable-devices 禁用所有设备
--enable-filter=NAME 启用指定NAME的过滤器名称
--disable-filter=NAME 禁用指定NAME的过滤器名称
--disable-filters 禁用所有过滤器

1.9 External library support 扩展库支持

使用以下任何选项将允许 FFmpeg 链接到相应的外部库。 如果满足所有其他依赖项并且未明确禁用它们,则依赖于该库的所有组件都将启用。 例如。 --enable-libopus 将启用与 libopus 的链接并允许构建 libopus 编码器,除非使用 --disable-encoder=libopus 明确禁用它。

请注意,只有系统库会被自动检测。 所有其他外部库必须显式启用。

另请注意,以下帮助文本描述了库本身的用途,并非它们的所有功能都必须由 FFmpeg 使用。

参数 参数作用
--disable-alsa 禁用 ALSA 支持 [自动检测]
--disable-appkit 禁用 Apple AppKit 框架 [自动检测]
--disable-avfoundation 禁用 Apple AVFoundation 框架 [自动检测]
--enable-avisynth 启用读取 AviSynth 脚本文件 [否]
--disable-bzlib 禁用 bzlib [自动检测]
--disable-coreimage 禁用 Apple CoreImage 框架 [自动检测]
--enable-chromaprint 使用 chromaprint 启用音频指纹识别,默认为否
--enable-frei0r 启用 frei0r 视频过滤 ,默认为否
--enable-gcrypt 启用 gcrypt,需要 rtmp(t)e 支持,如果未使用 openssl、librtmp 或 gmp则默认为否
--enable-gmp 启用 gmp,需要 rtmp(t)e 支持,如果未使用 openssl 或 librtmp则默认为否
--enable-gnutls 启用 gnutls,需要 https 支持,如果未使用 openssl、libtls 或 mbedtls则默认为否
--disable-iconv 禁用 iconv [自动检测]
--enable-jni 启用 JNI 支持,默认为否
--enable-ladspa 启用 LADSPA 音频过滤,默认为否
--enable-libaom 通过 libaom 启用 AV1 视频编码/解码,默认为否
--enable-libaribb24 通过 libaribb24 启用 ARIB 文本和字幕解码,默认为否
--enable-libass 启用 libass 字幕渲染,需要字幕,默认为否
--enable-libbluray 使用 libbluray 启用蓝光阅读,默认为否
--enable-libbs2b 启用 bs2b DSP 库,默认为否
--enable-libcaca 使用 libcaca 启用文本显示,默认为否
--enable-libcelt 通过 libcelt 启用 CELT 解码,默认为否
--enable-libcdio 启用使用 libcdio 抓取音频 CD,默认为否
--enable-libcodec2 使用 libcodec2 启用 codec2 编码/解码,默认为否
--enable-libdav1d 通过 libdav1d 启用 AV1 解码,默认为否
--enable-libdavs2 通过 libdavs2 启用 AVS2 解码,默认为否
--enable-libdc1394 使用 libdc1394和libraw1394启用IIDC-1394 抓取
--enable-libfdk-aac 通过 libfdk-aac 启用 AAC 解码/编码,默认为否
--enable-libflite 通过 libflite 启用 flite(语音合成)支持,默认为否
--enable-libfontconfig 启用 libfontconfig,对 drawtext 过滤器有用,默认为否
--enable-libfreetype 启用 libfreetype,drawtext 过滤器需要,默认为否
--enable-libfribidi 启用 libfribidi,改进 drawtext 过滤器,默认为否
--enable-libglslang 启用 GLSL->SPIRV 编译通过 libglslang,默认为否
--enable-libgme 通过 libgme 启用游戏音乐 Emu,默认为否
--enable-libgsm 通过 libgsm 启用 GSM 解码/编码,默认为否
--enable-libiec61883 通过 libiec61883 启用 iec61883,默认为否
--enable-libilbc 通过 libilbc 启用 iLBC 解码/编码,默认为否
--enable-libjack 启用 JACK 音频声音服务器,默认为否
--enable-libklvanc 启用内核实验室 VANC 处理,默认为否
--enable-libkvazaar 通过 libkvazaar 启用 HEVC 编码,默认为否
--enable-liblensfun 启用 lensfun 镜头校正,默认为否
--enable-libmodplug 通过 libmodplug 启用 ModPlug,默认为否
--enable-libmp3lame 通过 libmp3lame 启用 MP3 编码,默认为否
--enable-libopencore-amrnb 通过 libopencore-amrnb 启用 AMR-NB 解码/编码,默认为否
--enable-libopencore-amrwb 通过 libopencore-amrwb 启用 AMR-WB 解码,默认为否
--enable-libopencv 通过 libopencv 启用视频过滤,默认为否
--enable-libopenh264 通过 OpenH264 启用 H.264 编码,默认为否
--enable-libopenjpeg 通过 OpenJPEG 启用 JPEG 2000 解码/编码,默认为否
--enable-libopenmpt 启用通过 libopenmpt 解码跟踪的文件,默认为否
--enable-libopenvino 启用 OpenVINO 作为 DNN 模块后端,默认为否
--enable-libopus 通过 libopus 启用 Opus 解码/编码,默认为否
--enable-libpulse 通过 libpulse 启用 Pulseaudio 输入,默认为否
--enable-librabbitmq 启用 RabbitMQ 库,默认为否
--enable-librav1e 通过 rav1e 启用 AV1 编码,默认为否
--enable-librist 通过 librist 启用 RIST,默认为否
--enable-librsvg 通过 librsvg 启用 SVG 光栅化,默认为否
--enable-librubberband 启用橡皮筋过滤器所需的橡皮筋,默认为否
--enable-librtmp 通过 librtmp 启用 RTMP[E] 支持,默认为否
--enable-libshine 通过 libshine 启用定点 MP3 编码,默认为否
--enable-libsmbclient 通过 libsmbclient 启用 Samba 协议,默认为否
--enable-libsnappy 启用 Snappy 压缩,需要 hap 编码,默认为否
--enable-libsoxr 启用libsoxr 重采样,默认为否
--enable-libspeex 通过 libspeex 启用 Speex 解码/编码,默认为否
--enable-libsrt 通过 libsrt 启用 Haivision SRT 协议,默认为否
--enable-libssh 通过 libssh 启用 SFTP 协议,默认为否
--enable-libsvtav1 通过 SVT 启用 AV1 编码,默认为否
--enable-libtensorflow 启用TensorFlow作为基于DNN的过滤器的DNN模块后端,默认为否
--enable-libtesseract 启用 Tesseract,ocr 过滤器需要,默认为否
--enable-libtheora 通过 libtheora 启用 Theora 编码,默认为否
--enable-libtls 如果未使用openssl、gnutls或mbedtls,则启用https支持所需的LibreSSL,默认为否
--enable-libtwolame 通过 libttwolame 启用 MP2 编码,默认为否
--enable-libuavs3d 通过 libuavs3d 启用 AVS3 解码,默认为否
--enable-libv4l2 启用 libv4l2/v4l-utils,默认为否
--enable-libvidstab 使用 vid.stab 启用视频稳定,默认为否
--enable-libvmaf 通过 libvmaf 启用 vmaf 过滤器,默认为否
--enable-libvo-amrwbenc 通过 libvo-amrwbenc 启用 AMR-WB 编码,默认为否
--enable-libvorbis 通过 libvorbis 启用 Vorbis 编码/解码,默认为否
--enable-libvpx 通过 libvpx 启用 VP8 和 VP9 解码/编码,默认为否
--enable-libwebp 通过 libwebp 启用 WebP 编码,默认为否
--enable-libx264 通过 x264 启用 H.264 编码,默认为否
--enable-libx265 通过 x265 启用 HEVC 编码,默认为否
--enable-libxavs 通过 xavs 启用 AVS 编码,默认为否
--enable-libxavs2 通过 xavs2 启用 AVS2 编码,默认为否
--enable-libxcb 使用 XCB 启用 X11 抓取 [自动检测]
--enable-libxcb-shm 启用 X11 抓取 shm 通信 [自动检测]
--enable-libxcb-xfixes 启用 X11 抓取鼠标渲染 [自动检测]
--enable-libxcb-shape 启用 X11 抓取形状渲染 [自动检测]
--enable-libxvid 通过 xvidcore 启用 Xvid 编码,存在原生 MPEG-4/Xvid 编码器,默认为否
--enable-libxml2 使用 C 库 libxml2 启用 XML 解析,默认为否
--enable-libzimg 启用 z.lib,zscale 过滤器需要,默认为否
--enable-libzmq 启用通过 libzmq 传递消息,默认为否
--enable-libzvbi 通过 libzvbi 启用图文电视支持,默认为否
--enable-lv2 启用 LV2 音频过滤,默认为否
--disable-lzma 禁用 lzma [自动检测]
--enable-decklink 启用 Blackmagic DeckLink I/O 支持,默认为否
--enable-mbedtls 如果未使用openssl、gnutls或libtls,则启用https支持所需的mbedTLS,默认为否
--enable-mediacodec 启用 Android MediaCodec 支持,默认为否
--enable-mediafoundation 通过 MediaFoundation 启用编码
--enable-libmysofa 启用 libmysofa,需要 soflizer 过滤器,默认为否
--enable-openal 启用 OpenAL 1.1 捕获支持,默认为否
--enable-opencl 启用 OpenCL 处理,默认为否
--enable-opengl 启用 OpenGL 渲染,默认为否
--enable-openssl 如果未使用gnutls、libtls 或 mbedtls,则启用https支持所需的openssl,默认为否
--enable-pocketsphinx 启用 PocketSphinx,asr 过滤器需要,默认为否
--disable-sndio 禁用 sndio 支持 [自动检测]
--disable-schannel 禁用 SChannel SSP,需要 TLS 支持[自动检测]
--disable-sdl2 禁用 sdl2 [自动检测]
--disable-securetransport 禁用安全传输,需要 TLS 支持
--enable-vapoursynth 启用 VapourSynth 解复用器,默认为否
--enable-vulkan 启用 Vulkan 代码,默认为否
--disable-xlib 禁用 xlib [自动检测]
--disable-zlib 禁用 zlib [自动检测]

以下库提供各种硬件加速功能:

参数 参数作用
--disable-amf 禁用 AMF 视频编码代码 [自动检测]
--disable-audiotoolbox 禁用 Apple AudioToolbox 代码 [自动检测]
--enable-cuda-nvcc 启用 Nvidia CUDA 编译器,默认为否
--disable-cuda-llvm 使用 clang, 禁用 CUDA 编译[自动检测]
--disable-cuvid 禁用 Nvidia CUVID 支持 [自动检测]
--disable-d3d11va 禁用 Microsoft Direct3D 11 视频加速代码 [自动检测]
--disable-dxva2 禁用 Microsoft DirectX 9 视频加速代码 [自动检测]
--disable-ffnvcodec 禁用动态链接的 Nvidia 代码 [自动检测]
--enable-libdrm 启用 DRM 代码 (Linux),默认为否
--enable-libmfx 通过 libmfx 启用英特尔 MediaSDK(AKA 快速同步视频)代码,默认为否
--enable-libnpp 启用基于 Nvidia Performance Primitives 的代码,默认为否
--enable-mmal 通过 MMAL 启用 Broadcom 多媒体抽象层 (Raspberry Pi) ,默认为否
--disable-nvdec 禁用 Nvidia 视频解码加速(通过 hwaccel)[自动检测]
--disable-nvenc 禁用 Nvidia 视频编码代码 [自动检测]
--enable-omx 启用 OpenMAX IL 代码,默认为否
--enable-omx-rpi 为 Raspberry Pi 启用 OpenMAX IL 代码 ,默认为否
--enable-rkmpp 启用瑞芯微媒体处理平台代码 ,默认为否
--disable-v4l2-m2m 禁用 V4L2 mem2mem 代码 [自动检测]
--disable-vaapi 禁用视频加速 API(主要是 Unix/Intel)代码 [自动检测]
--disable-vdpau 禁用适用于 Unix 代码的 Nvidia Video Decode 和 Presentation API [自动检测]
--disable-videotoolbox 禁用 VideoToolbox 代码 [自动检测]

1.10 Toolchain options 工具链选项

参数 参数作用
--arch=ARCH 选择架构
--cpu=CPU 选择所需的最小CPU(影响指令选择,可能会在较旧的 CPU 上崩溃)
--cross-prefix=PREFIX 编译工具使用 PREFIX
--progs-suffix=SUFFIX 程序名后缀
--enable-cross-compile 假设使用了交叉编译器
--sysroot=PATH 交叉构建树的根
--sysinclude=PATH 交叉构建系统头文件的位置
--target-os=OS 编译器目标 OS
--target-exec=CMD 目标上运行可执行文件的命令
--target-path=DIR 在目标上查看构建目录的路径
--target-samples=DIR 目标样本目录的路径
--tempprefix=PATH 强制固定目录/前缀而不是 mktemp 进行检查
--toolchain=NAME 根据 NAME 设置工具默认值
--nm=NM 使用 nm 工具 NM [nm -g]
--ar=AR 使用存档工具 AR [ar]
--as=AS 使用汇编器 AS
--ln_s=LN_S 使用符号链接工具 LN_S [ln -s -f]
--strip=STRIP 使用剥离工具STRIP [strip]
--windres=WINDRES 使用windows资源编译器WINDRES [windres]
--x86asmexe=EXE 使用 nasm 兼容的汇编程序 EXE [nasm]
--cc=CC 使用 C 编译器 CC [gcc]
--cxx=CXX 使用 C 编译器 CXX [g++]
--objcc=OCC 使用 ObjC 编译器 OCC [gcc]
--dep-cc=DEPCC 使用依赖生成器 DEPCC [gcc]
--nvcc=NVCC 使用 Nvidia CUDA 编译器 NVCC 或 clang
--ld=LD 使用链接器 LD
--pkg-config=PKGCONFIG 使用 pkg-config 工具 PKGCONFIG [pkg-config]
--pkg-config-flags=FLAGS 将附加标志传递给 pkgconf
--ranlib=RANLIB 使用ranlib RANLIB
--doxygen=DOXYGEN 使用 DOXYGEN 生成 API doc [doxygen]
--host-cc=HOSTCC 使用主机 C 编译器 HOSTCC
--host-cflags=HCFLAGS 在为主机编译时使用 HCFLAGS
--host-cppflags=HCPPFLAGS 在为主机编译时使用 HCPPFLAGS
--host-ld=HOSTLD 使用主机链接器 HOSTLD
--host-ldflags=HLDFLAGS 链接主机时使用 HLDFLAGS
--host-extralibs=HLIBS 链接主机时使用库 HLIBS
--host-os=OS 编译器主机操作系统
--extra-cflags=ECFLAGS 将 ECFLAGS 添加到 CFLAGS
--extra-cxxflags=ECFLAGS 将 ECFLAGS 添加到 CXXFLAGS
--extra-objcflags=FLAGS 将 FLAGS 添加到 OBJCFLAGS
--extra-ldflags=ELDFLAGS 将 ELDFLAGS 添加到 LDFLAGS
--extra-ldexeflags=ELDFLAGS 将 ELDFLAGS 添加到 LDEXEFLAGS
--extra-ldsoflags=ELDFLAGS 将 ELDFLAGS 添加到 LDSOFLAGS
--extra-libs=ELIBS 添加 ELIBS
--extra-version=STRING 版本字符串后缀
--optflags=OPTFLAGS 覆盖优化相关的编译器标志
--nvccflags=NVCCFLAGS 覆盖 nvcc 标志
--build-suffix=SUFFIX 库名后缀
--enable-pic 构建与位置无关的代码
--enable-thumb 编译 Thumb 指令集
--enable-l 使用链接时优化
--env="ENV=override" 覆盖环境变量

1.11 Advanced options 高级选项

参数 参数作用
--malloc-prefix=PREFIX 前缀 malloc 和带有 PREFIX 的相关名称
--custom-allocator=NAME 使用支持的自定义分配器
--disable-symver 禁用符号版本控制
--enable-hardcoded-tables 使用硬编码表而不是运行时生成
--disable-safe-bitstream-reader 在位读取器中禁用缓冲区边界检查(更快,但可能会崩溃)
--sws-max-filter-size=N swscale 使用的最大过滤器大小 ,默认为256

1.12 Optimization options 优化选项

参数 参数作用
--disable-asm 禁用所有程序集优化
--disable-altivec 禁用 AltiVec 优化
--disable-vsx 禁用 VSX 优化
--disable-power8 禁用 POWER8 优化
--disable-amd3dnow 禁用 3DNow!优化
--disable-amd3dnowext 禁用 3DNow!扩展优化
--disable-mmx 禁用 MMX 优化
--disable-mmxext 禁用 MMXEXT 优化
--disable-sse 禁用 SSE 优化
--disable-sse2 禁用 SSE2 优化
--disable-sse3 禁用 SSE3 优化
--disable-ssse3 禁用 SSSE3 优化
--disable-sse4 禁用 SSE4 优化
--disable-sse42 禁用 SSE4.2 优化
--disable-avx 禁用 AVX 优化
--disable-xop 禁用 XOP 优化
--disable-fma3 禁用 FMA3 优化
--disable-fma4 禁用 FMA4 优化
--disable-avx2 禁用 AVX2 优化
--disable-avx512 禁用 AVX-512 优化
--disable-aesni 禁用 AESNI 优化
--disable-armv5te 禁用 armv5te 优化
--disable-armv6 禁用 armv6 优化
--disable-armv6t2 禁用 armv6t2 优化
--disable-vfp 禁用 VFP 优化
--disable-neon 禁用 NEON 优化
--disable-inline-asm 禁用内联汇编
--disable-x86asm 禁用独立 x86 程序集
--disable-mipsdsp 禁用 MIPS DSP ASE R1 优化
--disable-mipsdspr2 禁用 MIPS DSP ASE R2 优化
--disable-msa 禁用 MSA 优化
--disable-msa2 禁用 MSA2 优化
--disable-mipsfpu 禁用浮点 MIPS 优化
--disable-mmi 禁用龙芯 SIMD 优化
--disable-fast-unaligned 考虑未对齐访问缓慢

1.13 开发人员选项

参数 参数作用
--disable-debug 禁用调试符号
--enable-debug=LEVEL 设置调试级别
--disable-optimizations 禁用编译器优化
--enable-extra-warnings 启用更多编译器警告
--disable-stripping 禁用剥离可执行文件和共享库
--assert-level=level 0(默认),1或2,断言测试的数量,2 会导致运行时变慢
--enable-memory-poisoning 用任意数据填充堆未初始化的分配空间
--valgrind=VALGRIND 通过 valgrind 运行"make fate"测试以检测内存泄漏和错误,使用指定的 valgrind 二进制文件。不能与 --target-exec 结合使用
--enable-ftrapv 陷阱算术溢出
--samples=FATE 测试样本的路径位置
--enable-neon-clobber-test 检查 NEON 寄存器的破坏(应该是仅用于调试目的)
--enable-xmm-clobber-test 检查 XMM 寄存器的破坏(仅限 Win64;应仅用于调试目的)
--enable-random 随机启用/禁用组件
--enable-random=LIST 随机启用/禁用特定组件,LIST 是一个逗号分隔的列表 NAME[:PROB] 条目,其中 NAME 是一个组件(group) 和 PROB 相关的概率 名称(默认 0.5)。
--random-seed=VALUE --enable/disable-random 的种子值
--disable-valgrind-backtrace 在 Valgrind 下不打印回溯(仅适用于 --disable-optimizations 构建)
--enable-ossfuzz 启用构建模糊器工具
--libfuzzer=PATH libfuzzer 的路径
--ignore-tests=TESTS 被忽略的测试
--enable-linux-perf 启用 Linux 性能监视器 API
--disable-large-tests 禁用使用大量内存的测试

本博文部分内容参考如下文章,特此感谢:

https://www.cnblogs.com/yongdaimi/p/16619804.html

https://juejin.cn/post/7076719206573539336

相关推荐
EasyNTS2 小时前
H5流媒体播放器EasyPlayer.js网页直播/点播播放器如果H.265视频在播放器上播放不流畅,可以考虑的解决方案
javascript·音视频·h.265
海天鹰2 小时前
ffmpeg区域颜色覆盖
ffmpeg
小gpt&2 小时前
实现qt拖拽显示或者播放
数据库·qt·音视频
EasyCVR5 小时前
ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案
大数据·人工智能·物联网·安全·音视频·监控视频接入
Black蜡笔小新7 小时前
H.265流媒体播放器EasyPlayer.js网页全终端安防视频流媒体播放器可以播放本地视频吗
javascript·音视频·h.265
菊风 Juphoon7 小时前
菊风视频能力平台开发服务正式入驻华为云云商店,成为华为云联营联运合作伙伴
华为云·音视频
无法雾题啊8 小时前
视频偏黄怎么调色?去黄提亮视频的方法
音视频·视频编解码
内核工匠9 小时前
WebRTC音视频同步原理与实现详解(上)
音视频·webrtc
mo47769 小时前
webrtc音频模块介绍(二) ADM
音视频·webrtc
索迪迈科技10 小时前
渣土车治理新方案:智能化引领安全与环保新时代
人工智能·安全·音视频·视频监控·车载监控·车辆安全