FFmpeg 的使用与Docker安装流媒体服务器
本文阐述的均为命令行的使用方式。
一、 介绍
本文读者会比较小众~ 看到此文的朋友,大概率是需要用到啦,简单说一下下。
就算是从来没接触过的朋友,其实也已经在生活的各个方面都接触过处理完东西(音视频)。
一句话来总结: 就是一款封装好的关于音视频方面的开源处理工具。
它功能强大,用途广泛,大量用于视频网站和商业软件(比如 和 ),也是许多音频和视频格式的标准编码/解码实现。
如果有接触过 (另外一个音视频处理框架),它的也有使用到 的编码器。
二、 安装
sudo apt-get
版本查看
ffmpeg --help
安装就一会的事情,主要还是要看怎么使用。
三、 使用
的命令行参数分布大致如下:
领C++音视频开发资料→「链接」
ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]
下面是一个例子。
ffmpeg \
-y \ # 全局参数
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数
-i input.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
output.avi # 输出文件
上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 。
如果不指明编码格式, 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。
ffmpeg -i input.avi output.mp4
四、 常见案例
本章节只是简单的介绍了如何使用,并且解释啦常用的参数,如果需要更详细全面的参数解释,可以查看官方文档。
封包格式(、视频格式)、编码、解码、帧率、I帧、B帧等等一些偏向于专业的名词,大伙如果有需求可以去仔细了解了解,我这边暂时只是简单使用一下。
4.1、转换编码格式
转换编码格式()指的是, 将视频文件从一种编码转成另一种编码。比如转成 H.264 编码,一般使用编码器,所以只需指定输出文件的视频编码器即可。
-i 1.mp4 -c:v .mp4
查看支持的编码器(也就是 - 简称为 -c:v 后面可以接的参数):
-
支持很多很多,不一一列举出来啦
4.2、转换文件格式:
-y -i 1.mp4 -c:v - -b:v 6000k .avi 其中,
:v 代表视频,:a 代表音频;
4.3、对已有视频进行抓图:
-i .avi -y -f -ss 8 -t 0.001 -s 'test.jpg'
4.4 调整码率
调整码率()指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。
-i 1.mp4 - 964K - 3856K - 2000K .mp4
4.5 改变分辨率()
下面是改变视频分辨率()的例子,从 1080p 转为 480p 。
-y -i 1.mp4 -vf scale=480:-1 .mp4
4.6 提取音频
有时,需要从视频里面提取音频(),可以像下面这样写。
-y -i 1.mp4 -vn -c:a copy .aac
上面例子中,-vn表示去掉视频,-c:a copy表示不改变音频编码,直接拷贝。
4.7、本地摄像头推流
ffmpeg -f video4linux2 -r 30 -i /dev/video0 -vcodec h264 -f flv rtmp://192.168.79.133:1935/live/stream0
稍微解释一下上面的命令:
注意:在虚拟机中使用摄像头需注意、将USB的兼容性设置成USB3.0 ,否则出现推流一直卡在那
五、 安装流媒体服务器,推流和拉流实现
这里我当时就是随便在上找了一个可以方式部署的流媒体服务器~
直接输入下面这条命令就可以构建成功啦。
sudo run -id --= -p 1935:1935 -p 8080:80 -p 8443:443 -p 554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp /:
推流和拉流测试
推流和拉流,要是接触过视频服务可能就比较了解~
粗糙的流程就大致如上图啦,推流就是将收集到的视频流推送到流媒体服务器上去,拉流就是从流媒体服务器上把视频拉取下来,进行播放。
至于如何收集视频,如何进行视频处理,更为详细的就没有介绍啦, 是涵盖了全流程的, 可以去了解了解。
里面牵扯到的 RTSP、RTMP、HTTP-FLV协议,都是一些视频相关的协议,可以去了解了解,我这里只测试了 RTSP和RTMP协议。
领C++音视频开发资料→「链接」
rtsp 推流和拉流
-re -i 1.mp4 - h264 - aac -f rtsp - tcp rtsp://192.168.79.133/live/room
(rtsp 端口我这里使用的是默认的 554,故而省略没写啦
拉流进行播放可以使用专门的播放器,也可以使用的组件来进行视频的播放
拉流进行播放
rtsp://192.168.79.133:554/live/room
常用的播放器 vlc media 也可以播放 rtsp 和 rtmp 协议的视频流。
播放器截图
然后正常播放就是ok啦
rtmp 推流
-re -i 1.mp4 - h264 - aac -f flv rtmp://192.168.79.133/live/room
rtmp://192.168.79.133:1935/live/room
rtmp协议的端口号是 1935 ~这些端口号,都是可以修改的,是否支持取决于你部署的流媒体服务器是什么样的。
播放器截图
(另外,这个流媒体服务器内部对视频做了处理,可以实现多种输出,你RTMP推上去的,也可以用RTSP协议拉流下来的)