ffmpeg解复用编解码 常用API大全给出详细中文解释
Posted 杀神李
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg解复用编解码 常用API大全给出详细中文解释相关的知识,希望对你有一定的参考价值。
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
将你给出的条目设置进入你给到的 pm 中 如果条目存在 则覆盖他
小提示:如果AV_DICT_DONT_STRDUP_KEY宏和AV_DICT_DONT_STRDUP_VAL被设置了 这些参数会在出错时释放
警告:添加一个全新的条目到pm会使所有已存在的条目失效 可以使用av_dict_get得到
参数 pm:一个指向AVDictionary结构体的二重指针 如果*pm为空 那么一个AVDictionay结构体会被分配然后使*pm等于他
参数 key:添加进入*pm的key值 (类似于词典 key-value的形式去设置一些参数)到底是会发生覆盖还是添加一个新key取决于你设置的第三个参数 flags
参数 value 添加进入*pm的value值 (类似于词典 key-value的形式去设置一些参数)到底是会发生覆盖还是添加一个新value 取决于你设置的第三个参数 flags 如果传递一个空值将会导致已经存在的条目被删除
返回值: >=0表示成功 否则表示失败
首先讲这个的原因是许多ffmpeg 函数最后都能传入一个AVDictionary来做一些设置
tips:如何通过AVDictionary 设置ffmpeg各种参数 详见另一篇文章 FFMPEG Tips (5) 如何利用 AVDictionary 配置参数_Jhuster的专栏的技术博客_51CTO博客
void av_log_set_callback(void (*callback)(void*, int, const char*, va_list));
设置超时回调 特别是网络流 经常是会超时的 这很常见 所以基本是需要设置的 这个东西
回调函数必须是线程安全的 即使你的程序运行在单线程环境下也必须是线程安全的 因为一些解码器内部工作时是多线程的
AVFormatContext *avformat_alloc_context(void);
分配一个AVFormatContext结构体
avformat_free_context()可以用来释放这个结构体和任何一切AVFormatContext内分配的东西比如AVIOContext
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options);
打开输入流并且读他的头部 编解码器此时并未打开 打开的流必须通过avformat_close_input()来关闭 通过读头的过程 解复用器就能正常工作了 以后就可以通过av_read_frame来读取AVPacket
参数 ps:指向用户刚刚通过avformat_alloc_context函数分配得来的AVFormatContext 如果用户还没通过avformat_alloc_context也没事内部会分配内存并写入ps
参数 url:打开流的URL
参数fmt:如果非空 则强制指定特定的输入格式 否则输入格式由ffmpeg内部确定
参数 options:包含了AVFormatContext和解复用器私有参数的dictionary 在返回时 这个参数会被销毁并且被替换为包含未找到选项的dictionary 也就是说如果你乱填一些ffmpeg不支持的选项 ffmpeg会直接给你返回回来 也许是空的
返回值:返回0表示成功 返回AVERROR表示失败
tips:如果你想使用自定义io输入 提前分配avio结构体 并且设置他的pb成员 关于如何自定义io输入模式 请看
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
函数内部会把整个解复用解码流程走一遍 读取数个AVPacket来拿到复用格式中流的信息 比如到底有几条流 音频流还是视频流还是字幕流 这些流是用的什么格式 比如h.264 h.265 aac 这些流适合用什么编码解码解码
这个函数对于没有头的文件格式是非常有效的 比如MPEG
这个方法即使在MPEG-2重复帧模式下也会计算真实帧率
文件指针位置并不会因为这个函数读取了数个AVPacket而发生变化
读取过后的数个AVPacket可能会被缓冲用作之后的处理 比如av_read_frame
参数 ic:你刚刚打开的AVFormatContext
参数 options:如果非null,则为指向dictionary的指针的ic.nb_streams长数组,其中第i个成员包含对应于第i个流的编解码器选项。
返回值:>=0表示成功 AVERROR_xxx表示失败
这个方法不会保证打开所有的编解码器去读取数个AVPacket 所以在返回时 options非空是正常的
接下来 让用户以某种方式决定需要什么信息,这样ffmpeg内部就不会浪费时间去获取用户不需要的东西
int av_find_best_stream(AVFormatContext *ic,
enum AVMediaType type,
int wanted_stream_nb,
int related_stream,
AVCodec **decoder_ret,
int flags);
找到用户最希望的流的索引 因为没有索引的话 你后面通过av_read_frame读出来的AVPaket你就无法分辨到底是音频的Packet还是视频的Packet 所以必须通过这个函数去找到流索引 AVPacket里有一个字段来表明他是属于哪一个索引的
参数 ic:上文的AVFormatContext
参数 AVMediaType type:你希望找到的流的类型 比如音频视频字幕等等
参数 wanted_stream_nb:用户希望的流的索引 ffmpeg尽量满足 实在满足不了 也只能返回你不希望的 设置-1自动选择
参数 related_stream:尝试去找到与你指定type相关的流 如果没有的话 设置-1
参数 decoder_ret:如果非空 返回你指定的流的编解码器 后面就可以直接打开了 不然的话你需要手动根据流信息去查找 通过调用avcodec_find_decoder这个函数
参数 flags:一些选项
返回值:你指定的type的流的索引 返回AVERROR_STREAM_NOT_FOUND表示压根没找到你指定的类型 如果找到了流但是没有对应的解码器 一样是会返回AVERROR_STREAM_NOT_FOUND
tips:如果返回成功 并且decoder_ret非空 那么ffmpeg保证给你返回的decoder是有效的 是可以直接打开的
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
分配编解码器上下文结构体内存 然后设置为默认值 这个编解码器上下文必须通过avcodec_free_context()来释放
参数 codec:如果非空 特定于你传入的编解码器的内存被分配并且初始化 如果你传了codec 但是后面又使用avcodec_open2来打开其他编解码器是非法的
如果空 然后特定于编解码器的默认值将不会被初始化,这可能会导致次优的默认设置,这可能会导致默认设置不理想(这主要对编码器来说很重要,例如libx264)。
返回值:充满默认值的编解码器上下文 或者空表示失败
int avcodec_parameters_to_context(AVCodecContext *codec,
const AVCodecParameters *par);
根据提供的编解码器参数的值填充编解码器上下文。在编解码器中,任何在par中有对应字段的已分配字段将被释放并替换为par中对应字段的副本。在编解码器中没有对应字段的字段将不会被修改。通过这个函数后
参数 codec:编解码器上下文
参数 par: 流中关于编解码器的信息 在上文 find_stream_info时候就已经填充了AVStream里的AVCodecParametes 所以这里可以直接传入
返回值:>=0表示成功 或者返回AVERROR表示失败
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
初始化编解码器上下文来使用编解码器 在使用这个方法之前 确保你已经使用avcodec_alloc_context3()来分配内存了 通过以下四个函数来找到编解码器是非常简单的
avcodec_find_decoder_by_name()
avcodec_find_encoder_by_name()
avcodec_find_decoder()avcodec_find_encoder()
警告:这个方法不是线程安全的
在调用这个方法之前请不要使用解码流程 如avcodec_send_packet和av_receive_frame
参数 avctx:需要初始化的编解码器上下文
参数 codec:需要打开的编解码器 如果之前你通过avcodec_alloc_context3这个函数来指定了需要打开什么编解码器 那么你就不能传入其他的编解码器
参数 options:你想要对上下文和编解码器所做的一些设置 在返回时没有找到的选项会给你返回出来 比如你乱填一些ffmpeg不支持的选项
返回值: 0表示成功 负数表示发生错误
AVFrame *av_frame_alloc(void);
分配一个AVFrame的内存并且初始化为默认值 通过这个函数分配的内存必须通过av_frame_free()来释放掉
返回值:AVFrame
注意这个函数只会分配AVFrame本身的内存而不会去分配实际的data buffer的内存 缓冲区内存必须通过av_frame_get_buffer函数分配 或者手动分配 上一张图就懂我在说什么了
具体实现类似于智能指针 内部会有一个引用计数去维护他 ffmpeg内存管理详见其他文章
AVPacket *av_packet_alloc(void);
分配一个AVPacket的内存然后初始化为默认值 分配后的内存必须通过 av_packet_free来释放掉
返回值:AVPacket
注意这个方法和 av_frame_alloc一样只会初始化他本身的字段 而不会去初始化他的data buffer 如果你想同时初始化data buffer你应该选择 av_new_packet
void av_init_packet(AVPacket *pkt);
初始化AVPacket的可选字段
注意这个不会去改变 data和size字段 这两个字段需要分别初始化
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
返回流中的下一个packet 他并不会保证这个AVPacket对于解码器是有效的 也就是说可能这个AVPacket你打开的编解码器根本解码不了 他会把流中的信息变成一个一个的AVPacket 你每调用一次返回一个AVPacket 并且他不会省略AVPacket中没用的信息(比如h.264中的sps pps sei等信息)来给编解码器提供最多的信息
如果传入的pkt的buf是NULL的 那么在你下一次调用av_read_frame和直到你调用avformat_close_input的时候他都是有效的 并且是永远有效 buf不会被释放也不会被更改
所以在你下一次调用av_read_frame的时候确保你已经使用av_packet_unref来释放掉了他的buf
对于视频来说 一个AVPacket恰好就包含了完整的一帧数据(并且可能夹杂了一些其他的信息)关于这个还挺重要的 以后再写文章描述吧 包括AVPacket和NALU之间的关系
对于音频来说 如果他的帧长是固定的 那么有可能一个AVPacket包含了几个帧 如果他的帧长是可变的 那么一个AVPacket只包含一个音频帧
tips:音频帧这个概念其实挺模糊的 他更像是一种规定 在发送方与接收方之间的一种约定 以后一起写个文章描述
其中 pkt的pts(显示时间戳) dts(解码时间戳) duration(建议的持续时间)这三个字段是基于AVStream中的time_base字段来计算的 如果你的视频中含有B帧 那么pkt中的pts是无效的 所以你最好是依赖dts来进行解码负荷
参数 s:上下文
参数pkt:经过你av_packet_alloc之后的pkt
返回值:0表示ok 负数表示失败
void av_packet_free(AVPacket **pkt);
释放packet内存 如果他拥有buf的引用计数 那么会首先释放掉他的引用计数
AVPacket *av_packet_clone(const AVPacket *src);
直接使用=是发生的浅拷贝 内部引用计数并不会加1 如果使用这个函数则是深拷贝 内部引用计数加1
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
给解码器提供原始的packet数据 就是把packet数据送去解码器解码 在内部,这个调用将复制相关的AVCodecContext字段,这可能会影响每个包的解码,并在包实际解码时应用它们 为什么可能会影响 举一个例子 比如
AVCodecContext.skip_frame字段 他复制过后就会去填充这个字段 这个字段指示解码器丢弃使用此函数发送的包所包含的帧。比如一个包可能包含多个音频帧 其中一些可能会丢弃
注意:在你传入的pkt的data buf字段必须是字节对齐的 不然的话就有可能会访问越界 因为一些比特流读取器是按照每一次4字节或者每一次8字节来读取的 如果字节不对齐 则有可能导致访问越界
注意:在使用这个API的时候请不要和一些老的API混用同一个AVCodecContext 不然有可能会造成一些不可预料的结果 建议老API就不要再使用了
tips:在使用本API之前确保你已经使用avcodec_open2来打开了编解码器
参数 avctx:上下文
参数 avpkt:通常是一个视频帧或者是几个音频帧 这个函数并不会去改变你pkt的buf数据 但是他会创造一个引用计数去指向你的data buf 如果你传入的buf没有引用计数 就是说你传入了一个没有数据的packet 那么他会创造一个引用计数 不像老一代的API 这个data buf中的数据是会被完全读取的 如果AVPacket中包含了多个帧 那么在你下一次send packet之前 你是需要去调用多次avcodec_receive_frame去读取frame的而不是一次 这个参数可以是NULL 如果你传入NULL 那么就认为你传入了一个flush packet 代表已经读到了流的结尾 第一次发flush packet会成功 以后发的都返回AVERROR_EOF,如果你发送flush packet时 解码器中还有frame没有读取完成 那么这些东西会在下一次av_receive_frame的时候返回
返回值:0表示成功
AVERROR(EAGAIN):现在解码器的状态不可以发送AVPacket 也就是说你还没有调用av_receive_frame去获取输出 那么你就不能再传入AVPacket
AVERROR_EOF:解码器已经被flush了 没有新的包可以被发送进去了 如果你发送了多个flush packet 那么也是返回这个错误
AVERROR(EINVAL):编解码器未打开 需要打开
AVERROR(ENOMEM):未知原因导致packet无法加入内部的队列 或者是一些解码错误导致的
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
返回解码后的视频帧或音频帧
参数 avctx:编解码器上下文
参数 frame:内部会给你申请一个data buf并添加引用计数去装解码后的音频帧或者视频帧 如果你传入的frame拥有data buf的引用计数 那么在操作之前 会首先抹去你的引用计数
返回值:0表示成功
AVERROR(EAGAIN):现在解码器的状态不可以接受AVFrame 也就是说你还没有调用av_send_packet去输入 那么你就不能再获取AVFrame
AVERROR_EOF:解码器已经被flush了 没有新的包可以被接收了
AVERROR(EINVAL):编解码器未打开 需要打开
AVERROR_INPUT_CHANGED:当设置flag AV_CODEC_FLAG_DROPCHANGED时适用 表示当前frame的一些属性发生了变化
FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )
FFmpeg 系列文章目录
【FFmpeg】Windows 搭建 FFmpeg 命令行运行环境
【FFmpeg】FFmpeg 相关术语简介
【FFmpeg】FFmpeg 相关术语简介 二
【FFmpeg】FFmpeg 帮助文档使用
【FFmpeg】ffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )
文章目录
一、FFmpeg 帮助信息
在 【FFmpeg】FFmpeg 帮助文档使用 博客中使用
ffmpeg -h
命令 , 可以在命令行输出 ffmpeg 基本命令帮助信息 , 其中打印出了如下几项信息 , 下面介绍下比较重要的几个配置选项 ;
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 + demuxers 组合
-muxers show available muxers // 显示可用的复用器
-demuxers show available demuxers // 显示可用的解复用器
-devices show available devices // 显示可用设备
-codecs show available codecs // 显示可用的编解码器 , 其等价于 encoders + decoders 组合
-decoders show available decoders // 显示可用的解码器
-encoders show available encoders // 显示可用的编码器
-bsfs show available bit stream filters // 显示可用的比特流 filters 过滤器
-protocols show available protocols // 显示可用协议 , 如 rtmp , rtsp 等 ;
-filters show available filters // 显示可用的过滤器 , 可用于 : 改变播放速度 , 加水印 , 加 Logo
-pix_fmts show available pixel formats // 显示可用的像素格式
-layouts show standard channel layouts // 显示标准声道名称
-sample_fmts show available audio sample formats // 显示可用的音频采样格式
-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 // 显示可用的硬件加速方法
二、显示版本信息 -version
帮助文档对应内容 :
-version show version // 显示版本
显示版本信息命令 :
ffmpeg -version
执行过程 : 打印出的版本号是 ffmpeg version n4.4-19-g8d172d9409
;
命令行输出 :
D:\\ffmpeg>ffmpeg -version
ffmpeg version n4.4-19-g8d172d9409 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10-win32 (GCC) 20210408
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libvmaf --enable-vulkan --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --enable-ffnvcodec --enable-cuda-llvm --enable-libglslang --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
三、ffmpeg 命令输出的固定信息
关于 ffmpeg 不管执行什么命令 , 都会打印出当前的以下信息 :
版本号信息 ffmpeg version n4.4-19-g8d172d9409
版权信息 Copyright
编译器信息 built with gcc 10-win32 (GCC) 20210408
编译配置信息 configuration:
各个库的版本信息如下
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
四、显示编译配置信息 -buildconf
帮助文档对应内容 :
-buildconf show build configuration // 显示编译配置
显示编译配置信息命令 : FFmpeg 进行编译时 , 先配置 configure 文件 , 然后根据 configure 配置生成 Makefile 文件 , 再执行编译操作 ;
ffmpeg -buildconf
执行过程 : 打印出的编译时的 configure 配置信息 ;
命令行输出 :
D:\\ffmpeg>ffmpeg -buildconf
ffmpeg version n4.4-19-g8d172d9409 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10-win32 (GCC) 20210408
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libvmaf --enable-vulkan --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --enable-ffnvcodec --enable-cuda-llvm --enable-libglslang --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
configuration:
--prefix=/ffbuild/prefix
--pkg-config-flags=--static
--pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32-
--arch=x86_64
--target-os=mingw32
--enable-gpl
--enable-version3
--disable-debug
--enable-shared
--disable-static
--disable-w32threads
--enable-pthreads
--enable-iconv
--enable-libxml2
--enable-zlib
--enable-libfreetype
--enable-libfribidi
--enable-gmp
--enable-lzma
--enable-fontconfig
--enable-libvorbis
--enable-opencl
--enable-libvmaf
--enable-vulkan
--enable-amf
--enable-libaom
--enable-avisynth
--enable-libdav1d
--enable-libdavs2
--enable-ffnvcodec
--enable-cuda-llvm
--enable-libglslang
--enable-libgme
--enable-libass
--enable-libbluray
--enable-libmp3lame
--enable-libopus
--enable-libtheora
--enable-libvpx
--enable-libwebp
--enable-lv2
--enable-libmfx
--enable-libopencore-amrnb
--enable-libopencore-amrwb
--enable-libopenjpeg
--enable-librav1e
--enable-librubberband
--enable-schannel
--enable-sdl2
--enable-libsoxr
--enable-libsrt
--enable-libsvtav1
--enable-libtwolame
--enable-libuavs3d
--enable-libvidstab
--enable-libx264
--enable-libx265
--enable-libxavs2
--enable-libxvid
--enable-libzimg
--extra-cflags=-DLIBTWOLAME_STATIC
--extra-cxxflags=
--extra-ldflags=-pthread
--extra-ldexeflags=
--extra-libs=-lgomp
D:\\ffmpeg>
上述的 configuration:
后面的一行配置 与 ffmpeg -buildconf
打印出来的内容是一样的 ,
各个模块都编译成动态库 , 不支持静态库 ;
--enable-shared
--disable-static
支持 sdl2 , 这是做播放显示用的 ;
--enable-sdl2
支持 H.264 , H.265 编码 :
--enable-libx264
--enable-libx265
五、显示可用格式 -formats
1、基础命令
帮助文档对应内容 :
-formats show available formats // 显示可用格式 , 其等价于 muxers + demuxers 组合
显示可用格式命令 :
ffmpeg -formats
执行过程 :
命令行输出 :
D:\\ffmpeg>ffmpeg -formats
ffmpeg version n4.4-19-g8d172d9409 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10-win32 (GCC) 20210408
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libvmaf --enable-vulkan --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --enable-ffnvcodec --enable-cuda-llvm --enable-libglslang --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
File formats:
D. = Demuxing supported
.E = Muxing supported
--
D 3dostr 3DO STR
E 3g2 3GP2 (3GPP2 file format)
E 3gp 3GP (3GPP file format)
D 4xm 4X Technologies
E a64 a64 - video for Commodore 64
D aa Audible AA format files
D aac raw ADTS AAC (Advanced Audio Coding)
D aax CRI AAX
DE ac3 raw AC-3
D ace tri-Ace Audio Container
D acm Interplay ACM
D act ACT Voice file format
D adf Artworx Data Format
D adp ADP
D ads Sony PS2 ADS
E adts ADTS AAC (Advanced Audio Coding)
DE adx CRI ADX
D aea MD STUDIO audio
D afc AFC
DE aiff Audio IFF
D aix CRI AIX
DE alaw PCM A-law
D alias_pix Alias/Wavefront PIX image
DE alp LEGO Racers ALP
DE amr 3GPP AMR
D amrnb raw AMR-NB
D amrwb raw AMR-WB
E amv AMV
D anm Deluxe Paint Animation
D apc CRYO APC
D ape Monkey's Audio
DE apm Ubisoft Rayman 2 APM
... 打印的内容太多 , 省略部分 ...
D:\\ffmpeg>
名称中带 D 说明支持解复用 , 名称中带 E 说明支持复用 ;
D. = Demuxing supported
.E = Muxing supported
只支持解复用的格式 : 前面带 D ;
D 3dostr 3DO STR
支持复用的格式 : 前面带 E ;
E 3g2 3GP2 (3GPP2 file format)
支持复用与解复用的格式 : 前面带 DE ;
DE ac3 raw AC-3
2、查询指定格式信息
如果要查询 flv 格式相关的 复用 / 解复用 信息 , 使用如下命令 :
ffmpeg -formats | findstr flv
执行过程 :
命令行输出 :
D:\\ffmpeg>ffmpeg -formats | findstr flv
ffmpeg version n4.4-19-g8d172d9409 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10-win32 (GCC) 20210408
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --enable-libvmaf --enable-vulkan --enable-amf --enable-libaom --enable-avisynth --enable-libdav1d --enable-libdavs2 --enable-ffnvcodec --enable-cuda-llvm --enable-libglslang --enable-libgme --enable-libass --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --enable-libmfx --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --enable-libvidstab --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / FFmpegffmpeg 命令查询三 ( 查询 ffmpeg 命令分类支持的参数 )
FFmpegffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )
FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )
FFmpegffmpeg 命令查询一 ( 版本 | 编译配置 | 复用格式 | 编解码器 )
FFmpegffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )