CentOS Ubuntu使用FFmpeg实现FFmpeg推流

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。

许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。

下载

打开官网地址,进入下载页:https://ffmpeg.org/download.html#build-linux

1
wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz

解压

下载完成后,可以看到下载完成的文件后缀名为 .tar.xz ,执行对应解压命令解压文件:

1
xz -d ffmpeg-git-amd64-static.tar.xz

经过一次解压,.xz 后缀名已经被去掉。接下来执行:

1
tar -xvf ffmpeg-git-amd64-static.tar

解压完成后进入解压目录ffmpeg-git-[date]-amd64-static/:ffmpeg 和 ffprobe 都在这里。
在当前安装目录下执行 ./ffmpeg 命令,即可查看当前FFmpeg版本信息。
当然,倘若希望ffmpeg命令全局可用,可以在bin目录加个链接。比如,分别执行如下命令,即可在:/usr/bin目录下创建ffmpeg和ffprobe软链接。

1
2
3
4
cd /usr/bin

ln -s /home/ffmpeg-git-20191127-amd64-static/ffmpeg ffmpeg
ln -s /home/ffmpeg-git-20191127-amd64-static/ffprobe ffprobe

配置

编写Shell脚本,与此同时获取目标直播间的RTMP推流地址。

1
2
3
4
5
#!/bin/bash
while true
do
ffmpeg -re -f concat -safe 0 -i /home/video/mylist.txt -vcodec copy -acodec aac -b:a 192k -f flv "rtmp://*******"
done

其中mylist.txt文件内容格式应当如下:

1
2
3
4
5
6
7
8
9
10
11
#在Notepad++编码格式应为UTF-8无BOM编码
file 'WGP_New_01.mkv'
file 'WGP_New_02.mkv'
file 'WGP_New_03.mkv'
file 'WGP_New_04.mkv'
file 'WGP_New_05.mkv'
file 'WGP_New_06.mkv'
file 'WGP_New_07.mkv'
file 'WGP_New_08.mkv'
file 'WGP_New_09.mkv'
file 'WGP_New_10.mkv'

或者单个文件推流,命令如下。

1
2
ffmpeg -re -i /home/video/**.mp4 -vcodec copy -acodec aac -b:a 192k -f flv "rtmp://********"
#"rtmp://********"格式为该直播间rtmp地址/直播码

关于Linux中后台程序运行Screen的命令:

1
2
3
4
5
screen -S video           //初始化名为video的screen
screen -X -S [num] quit //退出[num]的screen
screen -ls //列出当前后台所有正在运行的screen
kill [num] //杀掉screen
CRTL A+D //后台运行当前screen

参数

1
2
3
4
5
6
-re 按照视频的FPS进行推流,必要参数。
-i 后加视频路径,也可以是网络上的视频地址
-vcodec copy 指定视频编码为复制。
-acodec aac 音频使用aac编码。后面的-b:a 192k则是指定码率。
-f flv 指定输出格式,这个必须是flv才能推到直播服务器,后接直播地址。
-i 指定的输入文件并不一定是本地文件,可以是网络视频流,甚至可以是.m3u8文件。

文末尾,附上一款SOCKS代理软件Proxifier,或许能解决某些系统级的代理问题(例如:OBS推流到Twitch)。