谈到视频编码相关内容就不得不提一个伟大的软件包 - FFmpeg。
FFmpeg 是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了 libavcodec -这是一个用于多个项目中音频和视频的解码器库,以及 libavformat -一个音频与视频格式转换库。
FFmpeg 这个单词中的 FF 指的是 Fast Forward。有些新手写信给 FFmpeg 的项目负责人,询问 FF 是不是代表 Fast Free 或者 Fast Fourier 等意思,FFmpeg 的项目负责人回信说:「Just for the record, the original meaning of FF in FFmpeg is Fast Forward.」
这个项目最初是由 Fabrice Bellard 发起的,而现在是由 Michael Niedermayer 在进行维护。许多 FFmpeg 的开发者同时也是 MPlayer 项目的成员,FFmpeg 在 MPlayer 项目中是被设计为服务器版本进行开发。
FFmpeg 下载地址是 : https://ffmpeg.org/download.html
可以浏览器输入下载,目前支持 Linux ,Mac OS,Windows 三个主流的平台,也可以自己编译到 Android 或者 iOS 平台。
如果是 Mac OS ,可以通过 brew 安装
brew install ffmpeg --with-libvpx --with-libvorbis --with-ffplay
我们可以用 FFmpeg 来做哪些有用有好玩的事情呢?通过一系列小实验来带大家领略 FFmpeg 的神奇和强大。
FFmpeg 录屏
通过一个小例子看一下怎么在 Mac OS 下面使用 FFmpeg 进行录屏:
输入:
ffmpeg -f avfoundation -list_devices true -i ""
输出:
[AVFoundation input device @ 0x7fbec0c10940] AVFoundation video devices:
[AVFoundation input device @ 0x7fbec0c10940] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7fbec0c10940] [1] Capture screen 0
[AVFoundation input device @ 0x7fbec0c10940] [2] Capture screen 1
[AVFoundation input device @ 0x7fbec0c10940] AVFoundation audio devices:
[AVFoundation input device @ 0x7fbec0c10940] [0] Built-in Microphone
给出了当前设备支持的所有输入设备的列表和编号,我本地有两块显示器,所以 1 和 2 都是我屏幕,可以选择一块进行录屏。
查看当前的 H.264 编解码器:
输入:
ffmpeg -codecs | grep 264
输出:
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_vda ) (encoders: libx264 libx264rgb )
查看当前的 VP8 编解码器:
输入:
ffmpeg -codecs | grep vp8
输出:
DEV.L. vp8 On2 VP8 (decoders: vp8 libvpx ) (encoders: libvpx )
可以选择用 VP8 或者 H264 做编码器
ffmpeg -r 30 -f avfoundation -i 1 -vcodec vp8 -quality realtime screen2.webm
# -quality realtime 用来优化编码器,如果不加在我的 Air 上帧率只能达到 2
or
ffmpeg -r 30 -f avfoundation -i 1 -vcodec h264 screen.mp4
然后用 ffplay 播放就可以了
ffplay screen.mp4
or
ffplay screen2.webp
有一个特别有用的需求,在网上发现了一个特别有趣的视频想把它转换成一个动态表情,作为一个 IT 从业者,我第一个想到的不是下载一个转码器,也不是去找一个在线转换网站,直接利用手边的工具 FFmpeg,瞬间就完成了转码:
ffmpeg -ss 10 -t 10 -i tutu.mp4 -s 80x60 tutu.gif
## -ss 指从 10s 开始转码,-t 指转换 10s 的视频 -s
可以继续扩展例子1,直播当前屏幕的内容,向大家介绍一下怎么通过几行命令搭建一个测试用的直播服务:
Step 1:首先安装 docker: 访问 https://www.docker.com/products/docker ,按操作系统下载安装。
Step 2:下载 nginx-rtmp 镜像:
docker pull chakkritte/docker-nginx-rtmp
Step 3:创建 nginx html 路径,启动 docker-nginx-rtmp
mkdir ~/rtmp
docker run -d -p 80:80 -p 1935:1935 -v ~/rtmp:/usr/local/nginx/html chakkritte/docker-nginx-rtmp
Step 4:推送屏幕录制到 nignx-rtmp
ffmpeg -y -loglevel warning -f avfoundation -i 2 -r 30 -s 480x320 -threads 2 -vcodec libx264 -f flv rtmp://127.0.0.1/live/test
Step 5:用 ffplay 播放
ffplay rtmp://127.0.0.1/live/test
总结一下,FFmpeg 是个优秀的工具,可以通过它完成很多日常的工作和实验,但是距离提供真正可用的流媒体服务、直播服务还有非常多的工作要做,这方面可以参考七牛云发布的七牛直播云服务 。