ffmpeg的安装、常用案例和命令.md
零、概述
FFmpeg是一款音视频编解码库,是多媒体开发者的必备技能。FFmepg提供了多种媒体格式的封装和解封装,包括音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等。
一、FFmepg的基本组成
FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库。
(1.1)FFmpeg的封装模块AVFormat
AVFormat实现了多媒体领域绝大数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、 TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmepg是否支持某种媒体封装格式取决于编译时是否包含了该格式的封装库。
(1.2)FFmpeg的编解码模块AVCodec
AVCodec包括大多数常用的编解码格式,既支持编码也支持解码。除了支持MPEG4、AAC、MJPEG等自带的媒体格式也支持H.264(x264编码器)、H.265(X265编码器)、MP3(libMP3lame编码器)。
(1.3)FFmepg的滤镜模块AVFilter
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。
(1.4)FFmpeg的视频图像转换计算模块swscale
swscale模块提供了高级别的图像转换API,它能够对图像进行缩放和像素格式转换。
(1.5)FFmpeg的音频转换计算模块swresample
swresample提供了音频重采样API,支持音频采样、音频通道布局、布局调整。
二、FFmpeg安装
FFmpeg可以编译安装,也可以使用RPM包安装,加入使用的是CentOS7 ,需要安装RPMFusion(Free版本)库来进行安装
https://rpmfusion.org/Configuration
yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm -y
yum install ffmpeg -y
三、FFmpeg的工作模式
ffmpeg -i input.mp4 output.avi
如上图显示了ffmpeg的工作模式,ffmpeg首先读取输入源,然后通过Demuxer将音视频包进行解封装,这个动作通过调用libavformat中的接口即可实现;接着通过Decoder进行解码,将音视频通过Decoder解包为YUV或者PCM这样的数据,Decoder通过libavcodec中的接口即可实现;然后通过Encoder将对应的数据进行编码,编码可以通过libavcodec中的接口实现;接下来将编码后的音视频数据包通过Muxer进行封装,Muxer封装通过libavformat中的接口即可实现,输出成为输出流。
四、使用ffprobe命令分析媒体文件
首先我们看到一大堆的FFmpeg编译信息,接下来是文件的MetaData信息,然后可以看到文件时长两小时19分钟,比特率1333kbps,接下来是视频信息和音频信息。我们可以看到视频是h264分辨率1280x720等等。
五、FFmpeg常用案例和命令
5.1 视频转换
比如一个avi文件,想转为mp4
ffmpeg -i input.avi output.mp4
#若mkv中使用mp4格式,可以直接拷出,速度快,秒级
ffmpeg -i test.mkv -c:v copy -c:a copy test.mp4
5.2 视频切割截取
下面的命令,可以从时间为00:00:15开始,截取5秒钟的视频。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表示开始切割的时间,-t表示要切多少。上面就是从15秒开始,切5秒钟出来。
5.3 缩小视频分辨率
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
写成scale=960:-1, 那也是可以的,ffmpeg会通知缩放滤镜在输出时保持原始的宽高比。
5.4 压缩视频(视觉上无损)
ffmpeg -i test1.mp4 -vf scale=960:-1 -c:v libx264 -preset veryslow -crf 18 -c:a copy test1-mini.mp4
ffmpeg -i test1.mp4 -c:v libx264 -preset veryslow -crf 18 -c:a copy test1-mini.mp4
调整-crf参数值,18-28是一个合理的范围。18被认为是视觉无损的(从技术角度上看当然还是有损的),它的输出视频质量和输入视频相当,数值越大视频质量越差。
5.5 (剧情连拍)
ffmpeg -i test1.mp4 -vf 'fps=1/60,scale=540:250,tile=3x5' -f image2 -y test1-srnsht-%d.jpg
#每60秒截取一张,单张图片宽540px高250px,每张汇总图放5行,每行3张图片。
与QQ影音不一样的是,这里的图片可以有好多张,QQ影音只会出一张,并且不能控制截取时间。
5.6 将视频转为HLS(m3u8)
ffmpeg -i sample.mp4 -c copy -bsf:v h264_mp4toannexb -hls_time 6 -hls_list_size 0 -hls_segment_filename "output/%04d.ts" "output/video.m3u8"
hls_time指定每段TS视频的时长,本例为6秒。会在output目录生成m3u8索引和ts视频文件。
参考资料
转载请注明:IPCPU-网络之路 » ffmpeg的基本概述、安装、常用案例和命令