FFmpe
g怎么念
FFmpeg
念作ef ef em peg
,其全称为 Fast Forward Moving Picture Expert Group
FFmpeg
是什么
FFmpeg是一套领先的多媒体框架,是一套开源且跨平台的多媒体解决方案,提供了音视频的编码、解码、转码、封装、解封装、流媒体、滤镜、播放等功能,官网地址为 ffmpeg.org
FFmpeg可以用来干嘛
- 视频播放器:很多视频播放器使用FFmpeg作为播放器内核,实现拉流、解封装、解码等功能,如射手播放器、暴风影音、QQ影音、KMPlayer、ijkplayer、MPlayer、VLC等,连Chrome浏览器的视频播放也使用了FFmpeg代码
- 视频转换工具:基本上市面上做视频格式转换、视频压制的软件都基于FFmpeg来实现,比如格式工厂、小丸工具箱等
除了播放和转换,其他如音视频录制、直播推流、滤镜应用等很多场景都可以使用FFmpeg
FFmpeg
的组成
使用FFmpeg有两种方式:
-
命令行工具:FFmpeg提供了三个命令行工具直接进行多媒体处理
ffmpeg
转换多媒体文件格式ffplay
基于SDL和FFmpeg
库的简单媒体播放器ffprobe
简单的多媒体流信息分析工具
-
模块库:FFmpeg提供了一些模块库,供开发者进行二次开发
libavutil
提供一些基础的工具函数,比如随机数生成、基础数据结构、文件操作、MD5 SHA加密方法等libavcodec
提供音视频的编码器、解码器,支持目前多媒体领域中绝大多数常用的编解码格式。除了自带的编码格式外,还支持第三方的编解码器,比如使用x264编解码器支持H.264/AVC编解码,使用x265编解码器支持H.265/HEVC编解码libavformat
提供媒体格式的解封装和封装,支持目前多媒体领域中绝大多数媒体封装格式,包括RTMP、RTSP、HLS等流媒体协议封装和MP3、MP4、FLV、TS等媒体文件封装。还支持媒体封装格式扩展,增加自己定制的封装处理模块libavdevice
提供音视频采集和渲染相关的输入/输出设备接口,兼容大部分通用多媒体输入/输出软件框架,比如Video4Linux、Video4Linux2、VfW、ALSA等libavfilter
提供通用的音频、视频、字幕等滤镜处理框架libswscale
提供深度优化的视频图像转换API,比如图像缩放(1080p转换成720p)、像素格式转换(yuv转rgb)等libswresample
提供深度优化的音频重采样API,比如采样频率转换(44100Hz转换到8000Hz)、声道格式转换(立体声转换为单声道)、样本格式转换(s16的PCM数据转换为f32的PCM数据)等
FFmpeg基础使用示例
- 视频格式转换:比如将avi文件转成mp4格式
ffmpeg -i input.avi output.mp4
- 视频剪切:比如从时间为00:00:15开始,截取5秒钟的视频 (-ss表示开始切割的时间,-t表示要切多少)
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
- 提取音频:比如将一个MV变成音频文件 (-vn 不处理视频)
ffmpeg -i 千千阙歌现场版.mp4 -acodec copy -vn output.aac
- 提取视频:比如将一个视频去除音频 (-an 不处理音频)
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
- 视频加水印:比如给视频右上角加上淘宝直播图片水印
ffmpeg -i input.mp4 -i 淘宝直播_logo.png -filter_complex overlay output.mp4
- 视频缩放:比如将1920x1080分辨率的视频缩小到960x540
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
前端和FFmpeg有什么关联
- JS播放器:可以基于FFmpeg和WebAssembly实现浏览器端的JS播放器,或扩展浏览器端其他的音视频能力,更多详情可参考 《Web端H.265播放器研发解密》
- Node模块
fluent-ffmpeg
:node.js
中非常实用的模块,该模块简化了ffmpeg
复杂的命令操作,且配合文件上传以及视频流的处理等非常实用,更多详情可参考 fluent-ffmpeg
扩展阅读
- ffmpeg基础使用
- FFMPEG:图片如何合成视频
- @超级火爆的前端视频方案 FFmpeg ,带你体验一下~
- LosslessCut : 一个开源的跨平台视频剪切软件,目标是成为 FFmpeg 的图形前端。