FFmpeg概要:https://blog.csdn.net/u011146511/article/details/85229288
设置好FFmpeg的环境变量,就可以在命令行直接使用ffmpeg、ffprobe、ffplay命令;
FFmpeg支持单独的命令下载:https://evermeet.cx/ffmpeg/(使用https://www.jianshu.com/p/e85e7d561932)
***configure命令:可以产看FFmpeg支持的音视频编码、文件封装、流媒体传输协议;
configure配置选项:https://blog.csdn.net/chenwr2018/article/details/101023811
查看需要的第三方外部库:configure --help;可以通过添加对应编译参数进行功能的增加和删减(参照上面的configure配置选项);
查看FFmpeg的解码器支持:configure --list-decoders;
–help | print this message |
–list-decoders | 显示所有可用的解码器(h264/mjpeg等) |
–list-encoders | 显示所有可用的编码器(h264/mjpeg等) |
–list-hwaccels | 显示所有支持的硬编解码器(h264_videotoolbox/h264_mediacodec等) |
–list-demuxers | 显示所有支持解复用的容器(mp4/h264等) |
–list-muxers | 显示所有支持复用的容器(mp4/h264等) |
–list-parsers | show all available parsers |
–list-protocols | 显示所有支持的传输协议(rtmp/rtp等) |
–list-bsfs | 显示所有可用的格式转换(h264_mp4toannexb/aac_adtstoasc等) |
–list-indevs | 显示所有支持的输入设备(alsa/v4l2等) |
–list-outdevs | 显示所有支持的输出设备(alsa/opengl等) |
–list-filters | 显示支持的所有过滤器(scale/volume/fps/allyuv等) |
***ffmpeg:ffmpeg的主要用途是编码、解码、转码、媒体格式转换、转封装。
显示可用的硬件加速器:ffmpeg -hwaccels
帮助基础信息:ffmpeg --help
高级信息:ffmpeg --help long
全部信息:ffmpeg --help full
查看支持的视频封装和解封装格式:ffmpeg -formats
查看支持的视频封装格式:ffmpeg -muxers
查看支持的视频解封装格式:ffmpeg -demuxers
查看支持的编解码格式:ffmpeg -codecs
查看支持的编码格式:ffmpeg -encoders
查看支持的解码格式:ffmpeg -decoders
查看支持的流媒体协议:ffmpeg -protocols
查看支持哪些滤镜:ffmpeg -filters
查看具体的某一个格式(解封装、编解码、滤镜)的详细信息:例如查看封装格式flv的信息: ffmpeg -h muxer=flv
数据可视化分析波形图:ffplay -showmode 1 xx.mp3
数据可视化分析解码宏块过程:
数据可视化分析查看B帧和P帧信息:ffplay -vismv pf xx.mp4
抽取音频流:ffmpeg -i aa.mp4 -vn -accodec copy output.aac
抽取视频流:ffmpeg -i aa.mp4 -vcodec copy -an output.h264
封装AVFormat:通过libavformat库操作;
转码AVCodec:通过libavcodec库操作;
软编码:基于CPU进行的编码;
硬编码:Nvidia的GPU编码或者Intel的QSV,FFmpeg集成了Nvidia显卡视频处理模块;
查看GPU编码支持的参数信息:ffmpeg -h encoder=h264_nvenc
查看GPU解码支持的参数信息:ffmpeg -h decoder=h264_cuvid
如果要是用QSV硬编码,就要先开启支持:ffmpeg -hide_banner -codecs|grep h264,在编译的时候要--enable-libmfx
查看QSV编码支持的参数信息:ffmpeg -h encoder=h264_qsv;
查看QSV解码支持的参数信息:ffmpeg -h decoder=h264_qsv;
树莓派硬编码:在编译时要配置 --enable-omx-rpi
查看编码参数:ffmpeg -h encoder=h264_omx
OSX硬编码:h264_videotoolbox
OSX硬解码:h264_vda
OSX只支持VBR、ABR模式的编码;不支持CBR编码;
ffmpeg -h encoder=h264_videotoolbox;
mp3使用第三方库libmp3lame编码;ffmpeg -h encoder=libmp3lame;
查看支持的操作设备(这是在linux下的命令):ffmpeg -hide_banner -devices
linux下采集设备:fbdev (用于图像展示)、v412(用于采集摄像头)、x11grab(用于屏幕录制)
ffmpeg -h demuxer=fbdev;
OSX中的设备操作:采用avfoundation进行设备采集;
WIndows中设备的采集:
dshow:枚举当前设备上的音视频设备,入摄像头、麦克风、采集卡;
vfwcap:枚举和采集视频设备;
gdigrab:采集桌面和窗口;
滤镜avfilter:
在视频中增加水印需要支持FreeType、FontConfig、iconv;
drawtext滤镜:可以实现文字水印;
movie滤镜:可以实现图片水印;
overlay滤镜:画中画;可以配合正则表达式做成跑马灯样式的画中画;
colorkey滤镜:颜色;
ASS滤镜:ass字幕流加入视频流;视频加字幕有两种实心,一是将字幕编码进视频流,二是在封装容器中加入字幕流(这种方式需要封装容器支持加入字幕流);
chromakey滤镜:抠图与视频合并;
fps滤镜:视频截图,也可以使用ffmpeg vframe参数实现;
setpts:视频倍速处理;
音频滤镜:
pan滤镜:提取多声道的音频到新音频文件或者到多个音频流,也可以用ffmpeg的map_channel参数实现;
channelsplipt滤镜:将stereo(双声道,mono为单声道布局)布局方式的音频切分开,分成两个音频流;
单声道转双声道:ffmpeg -i left.aac -ac 2 output.m4a
volumedetect滤镜:音量分贝以及音频相关的一些信息;
showwavespic滤镜:绘制音频波形图;
atempo滤镜:音频倍速处理
***ffplay:不仅是播放器,也是codec、format、filter引擎的测试工具;
可视化媒体参数分析:ffplay --help;
最基础的播放: ffplay xx.mp4
带标题播放: ffplay -window_title "第一个视频" xx.mp4
查看播放的时间:time ffplay xx.mp4
1. 主要选项
'-x width' 强制以 "width" 宽度显示
'-y height' 强制以 "height" 高度显示
'-an' 禁止音频
'-vn' 禁止视频
'-ss pos' 跳转到指定的位置(秒)
'-t duration' 播放 "duration" 秒音/视频
'-bytes' 按字节跳转
'-nodisp' 禁止图像显示(只输出音频)
'-f fmt' 强制使用 "fmt" 格式
'-window_title title' 设置窗口标题(默认为输入文件名)
'-loop number' 循环播放 "number" 次(0将一直循环)
'-showmode mode' 设置显示模式
可选的 mode :
'0, video' 显示视频
'1, waves' 显示音频波形
'2, rdft' 显示音频频带
默认值为 'video',你可以在播放进行时,按 "w" 键在这几种模式间切换
'-i input_file' 指定输入文件
2. 一些高级选项
'-sync type' 设置主时钟为音频、视频、或者外部。默认为音频。主时钟用来进行音视频同步
'-threads count' 设置线程个数
'-autoexit' 播放完成后自动退出
'-exitonkeydown' 任意键按下时退出
'-exitonmousedown' 任意鼠标按键按下时退出
'-acodec codec_name' 强制指定音频解码器为 "codec_name"
'-vcodec codec_name' 强制指定视频解码器为 "codec_name"
'-scodec codec_name' 强制指定字幕解码器为 "codec_name"
3. 一些快捷键
'q, ESC' 退出
'f' 全屏
'p, SPC' 暂停
'w' 切换显示模式(视频/音频波形/音频频带)
's' 步进到下一帧
'left/right' 快退/快进 10 秒
'down/up' 快退/快进 1 分钟
'page down/page up' 跳转到前一章/下一章(如果没有章节,快退/快进 10 分钟)
'mouse click' 跳转到鼠标点击的位置(根据鼠标在显示窗口点击的位置计算百分比)
***ffprobe:信息查看工具
查看帮助信息:ffprobe --help
查看媒体数据包信息:ffprobe -show_packets xx.flv
查看媒体数据包具体信息:ffprobe -show_data -show_packets xx.flv
查看媒体数据的封装格式:ffprobe -show_format xx.mp4
查看帧信息:ffprobe -show_frames xx.mp4
查看留信息:ffprobe -show_streams
以json格式显示信息,(其他类似,支持cvs、xml、ini、flat格式显示):ffprobe -of json -show_packets xx.flv
只显示视频信息,以xml格式显示(只显示音频、只显示字幕类似):ffprobe -show_frames -select_streams v -of xml xx.mp4
***音视频同步:https://blog.csdn.net/weixin_38513602/article/details/85165023
ffplay音画同步
ffplay也是一个视频播放器,所以不得不提出来的一个问题是:音画同步。ffplay的音画同步的实现方式其实有
三种,分别是:以音频为主时间轴作为同步源,以视频为主时间轴作为同步源,以外部时钟为主时间轴作为同步
源。
下面就以音频为主时间轴来作为同步源来作为案例进行讲解,而且ffplay默认也是以音频为基准进行对齐的,那
么以音频作为对齐基准是如何实现的呢?
首先需要说明的是,播放器接收到的视频帧或者音频帧,内部都是会有时间戳(PTS时钟)来标识它实际应该在什
么时刻展示,实际的对齐策略如下:比较视频当前的播放时间和音频当前的播放时间,如果视频播放过快,则通过
加大延迟或者重复播放来降低视频播放速度,如果视频播放满了,则通过减小延迟或者丢帧来追赶音频播放的时间
点。关键就在于音视频时间的比较和延迟的计算,当前在比较的过程中会设置一个阈值,如果超过预设的阈值就应
该作出调整(丢帧或者重复渲染),这就是整个对齐策略。
在使用ffplay的时候,我们可以明确的指定使用那种对齐方式,比如:
ffplay pm.mp4 -sync audio
上面这个命令显式的指定了使用以音频为基准进行音视频同步的方式播放视频文件,当然这也是ffplay的默认播放设置。
ffplay pm.mp4 -sync video
上面这个命令显式的指定了使用以视频为基准进行音视频同步的方式播放视频文件。
ffplay pm.mp4 -sync ext
上面这个命令显式的指定了使用外部时钟为基准进行音视频同步的方式播放视频文件