简介
1、FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件
2、FFmpeg框架基本组成
- AVFormat 封装和解封装模块库 如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式,可以在该模块库中增加自己的封装处理模块。
- AVCodec 编解码模块库 支持MPEG4、AAC、MJPEG等自带的媒体编解码格式,还可支持第三方编解码器下x264、x265、libmp3lame等,可增加自己的编码格式的编解码模块(或硬件编解码)
- AVFilter 滤镜模块 提供一个通用的音频、视频、字幕等滤镜处理框架,滤镜框架可以有多个输入和多个输出
- swscale 视频图像转换计算模块 进行图像缩放和像素格式转换
- swresample 音频转换计算模块 进行高级别的音频重采样,操作音频采样、音频通道布局转换与布局调整
- AVDevice
- AVUtil
3、FFmpeg工具
- ffmpeg 用于音视频编解码,工作流程:解封装(Demuxer)——解码(Decoder)——编码(Encoder)——封装(Muxer),详解步骤:读取输入源;进行音视频的解封装;解码每一帧音视频数据;编码每一帧音视频数据;’进行音视频的重新封装;输出到目标
- ffplay 播放器工具(需要SDL进行基础支撑),用于音视频播放、可视化分析 ,提供音视频显示和播放相关的图像信息、音频的波形信息等,作为测试工具使用
- ffprobe 多媒体分析工具,用于音视频内容分析,可以从媒体文件或者媒体流中获取想要了解的媒体信息,如音频参数、视频参数、媒体容器的参数信息等,可以分析媒体文件中每个包的长度、包的类型、帧的信息等
5、FFmpeg编码支持与定制
FFmpeg只是提供一套基础的框架,所有的编码格式、文件封装格式与流媒体协议均可作为一个模块挂载到FFmpeg框架中,增减对应的编译参数选项可以对FFmpeg支持的格式进行裁剪
FFmpeg工具常用命令示例
1、ffmpeg常用命令
- 信息查询部分
- 公共操作参数部分
- 文件主要操作参数部分
- 视频操作参数部分
- 音频操作参数部分
- 字幕操作参数部分
ffmpeg --help #命令基础信息
ffmpeg --help long #高级参数部分
ffmpeg --help full #全部帮助信息
ffmpeg -L #支持的license协议
ffmpeg -version #查看ffmpeg版本
ffmpeg -formats #查看支持的文件格式
ffmpeg -codecs #查看支持的编解码全部信息
ffmpeg -encoders
ffmpeg -decoders
ffmpeg -filters #查看支持的滤镜
ffmpeg -h muxer=flv #查看某类型详细参数
ffmpeg -h encoder=h264
ffmpeg -i ./input.rmvb -vcodec mpeg4 -b:v 200k -r 15 -an output.mp4 #转码
2、ffprobe常用命令
ffprobe -show_data -show_packets input.flv #查看多媒体数据包信息
ffprobe -show_format output.mp4 #查看多媒体封装格式
ffprobe -show_frames input.flv #查看多媒体文件中的帧信息
ffprobe -show_streams input.flv #查看多媒体文件中的流信息
ffprobe -of xml[/JSON/INI/CSV/FLAT] -show_streams input.flv #XML格式化输出
ffprobe -show_frames -select_streams v -of xml input.mp4 #选择查看流媒体信息 音频(a) 视频(v) 字幕(s)
3、ffplay常用命令
ffplay -ss 10 -t 10 input.mp4 #从10秒开始播放10秒
ffplay -window_title "output" output.mp4 #显示自定义标题
ffplay -window_title "test" rtmp://test.com/live/stream #打开网络直播流
ffplay -window_title "test" -vf "subtitles=input.srt" output.mp4 #添加字幕文件到播放数据中
ffplay -showmode 1 output.mp3 #播放音频波形
ffplay-debug vis_mb_type -ss 10 -t 10 -autoexit output.mp4 #显示宏块
ffplay -vismv pf[/bf/bb] output.mp4 #显示运动估计信息 pf P帧向前 bf B帧向前 bb B帧向后
ffplay -flags2 +export_mvs -ss 10 output.mp4 -vf codecvie=mv=pf+bf+bb #滤镜方式显示运动估计信息(使用趋势)
视频文件切片
#将MP4文件切割为MP4切片
./ffmpeg -re -i input.mp4 -c copy -f seqment -seqment_format mp4 output_%d.mp4
#查看第一份切片的最后的时间戳
ffprobe -v quiet -show_packets -select_streams v output_0.mp4 2 > x |grep pts_time |tail -n 3
#生成ffconcat格式索引文件(常用于虚拟轮播等场景)
./ffmpeg -re -i input.mp4 -c copy -f seqment -seqment_format mp4 -seqment_list_type ffconcat -seqment_list output.lst output_%d.mp4
#生成FLAT格式索引文件
./ffmpeg -re -i input.mp4 -c copy -f seqment -seqment_format mp4 -seqment_list_type flat -seqment_list output.txt output_%d.mp4
#生成CSV格式索引文件(用于类数据库操作,也可用于根据CSV生成视图图像)
./ffmpeg -re -i input.mp4 -c copy -f seqment -seqment_format mp4 -seqment_list_type csv -seqment_list output.csv output_%d.mp4
#生成M3U8格式索引文件(HLS)
./ffmpeg -re -i input.mp4 -c copy -f seqment -seqment_format mp4 -seqment_list_type m3u8 -seqment_list output.m3u8 output_%d.mp4
#使切片时间戳归0
./ffmpeg -re -i intput.mp4 -c copy -f seqment -seqment_format mp4 -reset_timestamps 1 output_%d.mp4
#按照时间点切片