概述
本文主要来自于一个目标——“通过ffmpeg模拟直播推流”。这个句子其实包含的内容很多,在标题中我们至少可以看到几个关键词——ffmpeg、直播、模拟推流。
1)什么是ffmpeg
ffmpeg是一套视频处理和存储等的技术方案,重点“开源”、“免费”,“最主流的视频处理技术方案”,“各大厂商基本上都用”。其他的内容可以通过本链接或者各大搜索引擎去了解。
2)什么是直播
估计你第一反应就是斗鱼等里面的直播。那就太狭义了。我对此的定义是(纯IT属性的简单粗暴)——始终播放最新的视频数据,不能拖动到指定位置进行播放;如果源不断,则不会停止。直播的范围就很广了,有常见的斗鱼里面的那种直播,还有广电里的电视直播,当然视频安防监控,那种实时的画面也是直播。关于直播的相关内容,比如有哪些直播的传输技术方案,还是右转看链接或自己去搜索吧。
3)模拟推流
这里肯定有人会问,为啥要用模拟的。
第一,总不能去各大网站去截取直播视频源吧,这种既不太合法,也不一定能拿到啊,想想防盗链。
第二,如果视频源断了呢。so,求人不如求己,那就撸袖子开始搞吧,要啥视频源就自己找。
当然模拟的就有个弊端,一般是通过点播,通过相应的技术进行模拟输出为直播,那就不可避免的点播的视频是有开始和结束的,换到直播上就是循环播放。
好奇的小伙伴肯定会问,那某些视频大厂他们有些视频轮播(比如某部电视剧从第一集开始,一集集播,然后也不能拖动)他们不会用的是这种技术吧?
呵呵,答案是我也不知道的,因为我也没有研究过。勤奋的小伙伴可以自己去挖掘下。当然,有些人想了解有什么模拟推流的方式,还是右转看链接或者自己去了解(知识总是留给勤奋的人)。基础情况已经了解了,那接下去就是执行层面的事情。
1.环境背景
lz采用的是云上服务器,Linux版本,除了基础Nginx服务,其他啥也没有。so,本文也仅适用于Linux系统。
2.ffmpeg的安装
1)FFmpeg官网:http://www.ffmpeg.org
2)下载最新源码并解压(可以下载到任何位置)
wget http://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2
tar -zxvf ffmpeg-4.1.3.tar.bz2
3)安装ffmpeg
cd ffmpeg-4.1.3(进入到ffmpeg所在的文件下)
./configure
4)安装yasm(适用于在3中报错,yasm not found…)
yum install yasm
安装成功后,继续./configure
5)继续安装ffmpeg
make && make install
6)测试是否安装成功
ffmpeg 当出现类似如下时,则说明成功了。
在这里插入图片描述
2.尝试ffmpeg进行转码
1)先将某个点播视频源存入,这个处理方式就不说了吧…
2)如果不采用1)也可以将某直播视频源转存为点播,恰巧需要 针对某个直播视频源进行处理,我采用的是这种方式:
ffmpeg -i 'http://***/6.hd.m3u8' -vcodec copy -acodec copy /***/a.mp4
3)尝试转码输出为指定格式(ffmpeg的指令说明可以看之前的文章介绍)
然后可能会报如下错误,此时需要进入【3】进行集成x264的库
在这里插入图片描述
3.安装x264
1)下载x264的库并安装
git clone git://git.videolan.org/x264.git
// 到对应的路径下
./configure --enable-static --enable-share
make && make install
2)重新编译ffmpeg
// 到ffmpeg所在的文件夹下
./configure --enable-gpl --enable-libx264
make clean
make && make install
操作后,就能正常的进行转码了。但是如果要指定rtmp输出,报了如下错误。如果没有如下错误则忽略。
在这里插入图片描述
4.安装Nginx和Nginx-rtmp-modle
由于已经自带Nginx,因此这里查询服务器的Nginx的版本,并下载相应版本的Nginx代码下来。
1)查看服务器Nginx的版本号
sbin/nginx -v
2)下载对应的版本Nginx
wget http://nginx.org/download/nginx-1.12.2.tar.gz
3)备份之前的Nginx相关的内容,以防操作过程有误而引起异常
4)下载rtmp模块
git clone https://github.com/arut/nginx-rtmp-module.git
5)到Nginx所在路径下cd …/nginx-1.12.2
6)确认root目录下存在 /root/lnmp1.4/src/openssl-1.0.2l 。 如果不存在,则下载openssl-1…0.2l版本,并解压到/root/lnmp1.4目录下。
7)执行,注意路径需要根据具体的情况做调整,比如module等路径
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-openssl=/root/lnmp1.4/src/openssl-1.0.2l --add-module=/nginx-rtmp-module
make && make install
cp objs/nginx /usr/local/nginx/sbin/nginx
8)测试是否正常
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
9)检查是否有rtmp模块了
/usr/local/nginx/sbin/nginx -V
10)reload 或者restart
安装成功后就可以进行ffmpeg的模拟推流了
5. 模拟直播推流
1)ffmepg
udp输出
//后台执行方式:
setsid ./ffmpeg -re -fflags +genpts -stream_loop -1 -i input.ts -vcodec copy -acodec copy -f mpegts udp://238.112.112.112:3300
这里需要说明的是setsid是后台执行
这里的输出为udp输出。注意输出的udp地址可能是广播,组播,或者单播方式。需要根据具体的组网情况做处理。如果是整组服务器内都能接收到,可能各组服务器的网口流入流量会受一些影响。
组播的地址说明如下:(下图采至网络)
在这里插入图片描述
rtmp输出
ffmpeg -re -i input.mp4 -f flv rtmp://192.168.0.11/live
需要注意输入视频的音视频编码格式是否符合flv的格式输出
rtmp中的ip可以根据实际情况做调整,也可以加上端口号
hls输出
ffmpeg -re -i input.mp4 -vcodec copy -f flv rtmp://192.168.0.11/hls/live
dash输出
ffmpeg -re -i input.mp4 -vcodec copy -f flv rtmp://192.168.0.11/dash/live
其他说明
对于hls或dash,也可以将rtmp作为输入源,进行切片输出,比如
ffmpeg -i rtmp://localhost/rtmplive/ -vcodec copy -hls_time 5 live.m3u8
2)vlc
这里主要指udp输出
先安装vlc
vlc input.mp4 -I “dummy” -L --no-inhibit --sout ‘#std{access=udp{ttl=1}, mux=ts, dst=238.123.45.1:3001}’
需要注意的是,udp支持的音视频编码格式,如果输入源的格式不支持,需要进行相应的转码处理。
6.对外可访问url格式
1)udp
udp://238.123.45.1:3001
2)rtmp
rtmp://192.168.0.11/live
3)hls
http://192.168.0.11/hls/live.m3u8
相关的端口都是在Nginx的配网文件中配置好的。rtmp默认端口1935