适逢FFmpeg6.1发布,准备深入学习下FFmpeg,将会写下系列学习记录。
在此列出主要学习资料,后续再不列,感谢这些大神的探路和分享,特别是雷神,致敬!
《深入理解FFmpeg》 雷霄骅_FFMPEG,FFmpeg,视频质量评价-CSDN博客 chatGPT |
1、FFmpeg组成
命令行工具 | ffmpeg | 主命令行工具 |
ffplay | 基于SDL的播放器 | |
ffprobe | 获取多媒体信息 | |
基础库 | libavcodec | 编解码库 |
libavformat | 封装、解封库 | |
libavfilter | 滤镜库 | |
libavdevice | 多媒体输入/输出设备 | |
libavutil | 通用工具 | |
libswresample | 音频转换 | |
libswscale | 图像转换 | |
libpostproc | libavfilter后期效果处理 |
2、FFmpeg支持
./configure --list-encoders | 查看编码器支持 |
./configure --list-decoders | 查看解码器支持 |
./configure --list-muxers | 查看封装支持 |
./configure --list-demuxers | 查看解封装支持 |
./configure --list-protocols | 查看通信协议支持 |
ffmpeg -codecs | 查看全部编解码器 |
ffmpeg -encoders | 查看编码器 |
ffmpeg -decoders | 查看解码器 |
ffmpeg -filters | 查看滤镜 |
ffmpeg --help full | 查看全部信息 |
ffmpeg -h encoder/decoder /muxer/demuxer/filter=xxx | 查看具体参数 |
3、常用指令(需要啥功能问chatGPT是最好的)
ffmpeg -i in.mp4 -vn -acodec copy out.aac
ffmpeg -i in.mp4 -vcodec copy -an out.h264
ffmpeg -i in.mp4 -vcodec copy -an -bsf hevc_mp4toannexb -f hevc out.hevc
ffmpeg -i input -vf filter_name=parameters output
4、使用FFmpeg
命令行直接使用编译出的三个程序即可。
二次开发则需要编译出的库,在下面博文介绍了编译方法。
这里看下我编译出来的文件如下图
可以发现install中有四个文件夹:
bin: 命令行程序
include: 头文件
lib: 共享库
share: 例程及文档
再看一下install中具体的文件树:
- ├── bin
- │ ├── ffmpeg
- │ ├── ffplay
- │ └── ffprobe
- ├── include
- │ ├── libavcodec
- │ │ ├── ac3_parser.h
- │ │ ├── adts_parser.h
- │ │ ├── avcodec.h
- │ │ ├── avdct.h
- │ │ ├── avfft.h
- │ │ ├── bsf.h
- │ │ ├── codec_desc.h
- │ │ ├── codec.h
- │ │ ├── codec_id.h
- │ │ ├── codec_par.h
- │ │ ├── d3d11va.h
- │ │ ├── defs.h
- │ │ ├── dirac.h
- │ │ ├── dv_profile.h
- │ │ ├── dxva2.h
- │ │ ├── jni.h
- │ │ ├── mediacodec.h
- │ │ ├── packet.h
- │ │ ├── qsv.h
- │ │ ├── vdpau.h
- │ │ ├── version.h
- │ │ ├── version_major.h
- │ │ ├── videotoolbox.h
- │ │ ├── vorbis_parser.h
- │ │ └── xvmc.h
- │ ├── libavdevice
- │ │ ├── avdevice.h
- │ │ ├── version.h
- │ │ └── version_major.h
- │ ├── libavfilter
- │ │ ├── avfilter.h
- │ │ ├── buffersink.h
- │ │ ├── buffersrc.h
- │ │ ├── version.h
- │ │ └── version_major.h
- │ ├── libavformat
- │ │ ├── avformat.h
- │ │ ├── avio.h
- │ │ ├── version.h
- │ │ └── version_major.h
- │ ├── libavutil
- │ │ ├── adler32.h
- │ │ ├── aes_ctr.h
- │ │ ├── aes.h
- │ │ ├── ambient_viewing_environment.h
- │ │ ├── attributes.h
- │ │ ├── audio_fifo.h
- │ │ ├── avassert.h
- │ │ ├── avconfig.h
- │ │ ├── avstring.h
- │ │ ├── avutil.h
- │ │ ├── base64.h
- │ │ ├── blowfish.h
- │ │ ├── bprint.h
- │ │ ├── bswap.h
- │ │ ├── buffer.h
- │ │ ├── camellia.h
- │ │ ├── cast5.h
- │ │ ├── channel_layout.h
- │ │ ├── common.h
- │ │ ├── cpu.h
- │ │ ├── crc.h
- │ │ ├── csp.h
- │ │ ├── des.h
- │ │ ├── detection_bbox.h
- │ │ ├── dict.h
- │ │ ├── display.h
- │ │ ├── dovi_meta.h
- │ │ ├── downmix_info.h
- │ │ ├── encryption_info.h
- │ │ ├── error.h
- │ │ ├── eval.h
- │ │ ├── executor.h
- │ │ ├── ffversion.h
- │ │ ├── fifo.h
- │ │ ├── file.h
- │ │ ├── film_grain_params.h
- │ │ ├── frame.h
- │ │ ├── hash.h
- │ │ ├── hdr_dynamic_metadata.h
- │ │ ├── hdr_dynamic_vivid_metadata.h
- │ │ ├── hmac.h
- │ │ ├── hwcontext_cuda.h
- │ │ ├── hwcontext_d3d11va.h
- │ │ ├── hwcontext_drm.h
- │ │ ├── hwcontext_dxva2.h
- │ │ ├── hwcontext.h
- │ │ ├── hwcontext_mediacodec.h
- │ │ ├── hwcontext_opencl.h
- │ │ ├── hwcontext_qsv.h
- │ │ ├── hwcontext_vaapi.h
- │ │ ├── hwcontext_vdpau.h
- │ │ ├── hwcontext_videotoolbox.h
- │ │ ├── hwcontext_vulkan.h
- │ │ ├── imgutils.h
- │ │ ├── intfloat.h
- │ │ ├── intreadwrite.h
- │ │ ├── lfg.h
- │ │ ├── log.h
- │ │ ├── lzo.h
- │ │ ├── macros.h
- │ │ ├── mastering_display_metadata.h
- │ │ ├── mathematics.h
- │ │ ├── md5.h
- │ │ ├── mem.h
- │ │ ├── motion_vector.h
- │ │ ├── murmur3.h
- │ │ ├── opt.h
- │ │ ├── parseutils.h
- │ │ ├── pixdesc.h
- │ │ ├── pixelutils.h
- │ │ ├── pixfmt.h
- │ │ ├── random_seed.h
- │ │ ├── rational.h
- │ │ ├── rc4.h
- │ │ ├── replaygain.h
- │ │ ├── ripemd.h
- │ │ ├── samplefmt.h
- │ │ ├── sha512.h
- │ │ ├── sha.h
- │ │ ├── spherical.h
- │ │ ├── stereo3d.h
- │ │ ├── tea.h
- │ │ ├── threadmessage.h
- │ │ ├── timecode.h
- │ │ ├── time.h
- │ │ ├── timestamp.h
- │ │ ├── tree.h
- │ │ ├── twofish.h
- │ │ ├── tx.h
- │ │ ├── uuid.h
- │ │ ├── version.h
- │ │ ├── video_enc_params.h
- │ │ ├── video_hint.h
- │ │ └── xtea.h
- │ ├── libswresample
- │ │ ├── swresample.h
- │ │ ├── version.h
- │ │ └── version_major.h
- │ └── libswscale
- │ ├── swscale.h
- │ ├── version.h
- │ └── version_major.h
- ├── lib
- │ ├── libavcodec.so -> libavcodec.so.60.31.102
- │ ├── libavcodec.so.60 -> libavcodec.so.60.31.102
- │ ├── libavcodec.so.60.31.102
- │ ├── libavdevice.so -> libavdevice.so.60.3.100
- │ ├── libavdevice.so.60 -> libavdevice.so.60.3.100
- │ ├── libavdevice.so.60.3.100
- │ ├── libavfilter.so -> libavfilter.so.9.12.100
- │ ├── libavfilter.so.9 -> libavfilter.so.9.12.100
- │ ├── libavfilter.so.9.12.100
- │ ├── libavformat.so -> libavformat.so.60.16.100
- │ ├── libavformat.so.60 -> libavformat.so.60.16.100
- │ ├── libavformat.so.60.16.100
- │ ├── libavutil.so -> libavutil.so.58.29.100
- │ ├── libavutil.so.58 -> libavutil.so.58.29.100
- │ ├── libavutil.so.58.29.100
- │ ├── libswresample.so -> libswresample.so.4.12.100
- │ ├── libswresample.so.4 -> libswresample.so.4.12.100
- │ ├── libswresample.so.4.12.100
- │ ├── libswscale.so -> libswscale.so.7.5.100
- │ ├── libswscale.so.7 -> libswscale.so.7.5.100
- │ ├── libswscale.so.7.5.100
- │ └── pkgconfig
- │ ├── libavcodec.pc
- │ ├── libavdevice.pc
- │ ├── libavfilter.pc
- │ ├── libavformat.pc
- │ ├── libavutil.pc
- │ ├── libswresample.pc
- │ └── libswscale.pc
- └── share
- ├── ffmpeg
- │ ├── examples
- │ │ ├── avio_http_serve_files.c
- │ │ ├── avio_list_dir.c
- │ │ ├── avio_read_callback.c
- │ │ ├── decode_audio.c
- │ │ ├── decode_filter_audio.c
- │ │ ├── decode_filter_video.c
- │ │ ├── decode_video.c
- │ │ ├── demux_decode.c
- │ │ ├── encode_audio.c
- │ │ ├── encode_video.c
- │ │ ├── extract_mvs.c
- │ │ ├── filter_audio.c
- │ │ ├── hw_decode.c
- │ │ ├── Makefile
- │ │ ├── mux.c
- │ │ ├── qsv_decode.c
- │ │ ├── qsv_transcode.c
- │ │ ├── README
- │ │ ├── remux.c
- │ │ ├── resample_audio.c
- │ │ ├── scale_video.c
- │ │ ├── show_metadata.c
- │ │ ├── transcode_aac.c
- │ │ ├── transcode.c
- │ │ ├── vaapi_encode.c
- │ │ └── vaapi_transcode.c
- │ ├── ffprobe.xsd
- │ ├── libvpx-1080p50_60.ffpreset
- │ ├── libvpx-1080p.ffpreset
- │ ├── libvpx-360p.ffpreset
- │ ├── libvpx-720p50_60.ffpreset
- │ └── libvpx-720p.ffpreset
- └── man
- ├── man1
- │ ├── ffmpeg.1
- │ ├── ffmpeg-all.1
- │ ├── ffmpeg-bitstream-filters.1
- │ ├── ffmpeg-codecs.1
- │ ├── ffmpeg-devices.1
- │ ├── ffmpeg-filters.1
- │ ├── ffmpeg-formats.1
- │ ├── ffmpeg-protocols.1
- │ ├── ffmpeg-resampler.1
- │ ├── ffmpeg-scaler.1
- │ ├── ffmpeg-utils.1
- │ ├── ffplay.1
- │ ├── ffplay-all.1
- │ ├── ffprobe.1
- │ └── ffprobe-all.1
- └── man3
- ├── libavcodec.3
- ├── libavdevice.3
- ├── libavfilter.3
- ├── libavformat.3
- ├── libavutil.3
- ├── libswresample.3
- └── libswscale.3
以前在某个地方看到说so库的后缀中可以看到版本号,从ffmpeg的lib中看到这个不一致,也就是这个规则不存在的。
拿到这个install文件,实际就相当于一个ffmpeg的sdk了,利用它就开发自己的程序了。重点看看头文件中的函数,究竟给我们提供了怎样的接口函数、怎么使用就是难点了。