概述
FFmpeg,Nginx-rtmp-module搭建简易的流媒体服务器
说明:仅代表个人理解,肯定会有理解不准确的地方,劳烦指正,没有复制粘贴文档中的官方语言
一、FFmpeg的安装以及使用
1、FFmpeg简介
ffmpeg就是一款基于命令行操作的,处理视频的开源工具,比较轻量比较好用,主要功能有音视频分离,视频转码,视频切片,加滤镜等功能。官网地址:www.ffmpeg.org,由于外国的网站,下载可能比较慢,也是全英文的,所以推荐个中文文档 https://my.oschina.net/u/2367476/blog/904257
2、安装FFmpeg
安装ffmpeg还是比较简单的,除了下载速度很慢,关键是安装libx264等码库,这里的话,个人推荐不要用那个static版本,我用了一下,后来因为安装了libx264后还报错,也就没有深入研究了。
安装好ffmpeg后,将它的可执行文件ffmpeg和ffprobe添加到环境变量里,这样就可以全局执行了,比较方便
3、FFmpeg常用指令
#将其他视频格式,avi,flv等格式,转换为mp4
ffmpeg -i input.flv -acodec copy -vcodec libx264 output.mp4
可选参数:
-acodec 设置音频解码器,简写 -c:a
-vcodec 设置视频解码器,简写-c:v
-n 如果输出文件已存在,则直接退出,不转换
-f 强制指定输出格式
-movflags faststart 这个指令可以将MP4文件中的moov移动到文件的最前面,以便支持边下边播
#视频切片,应该是只支持MP4格式,所以需要先转换成MP4
ffmpeg -i https://liurq-pic.oss-cn-beijing.aliyuncs.com/test.mp4 -f segment -segment_time 2 -segment_format mpegts -segment_list /root/test/test.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 /root/test/test-%04d.ts
参数说明:
-i 输入文件,支持网络连接格式
-f 指定输出格式为segment
-segment_time 2 指定分片长度为2s
-segment_format mpegts 覆盖内部容器格式,默认情况下它由文件名扩展名猜测
-segment_list 指定生成的索引文件的存放地址以及文件名
-bsf:v bsf表示binary steam fiter ,v表示video
-map 这个比较复杂,参考博客https://blog.csdn.net/xiaoluer/article/details/81136478
path/filename.ts 代表生成的视频切片的保存路径,需要保证m3u8索引文件和ts文件在同一目录下
#视频推流
ffmpeg -re -i test.mp4 -vcodec copy -codec copy -f flv rtmp://192.168.8.129:1935/vod/test
-re :限制推流速度为真实速度,就是1秒只推流1s的视频,从而达到直播的效果,不然一下推完,也不能算是直播
说明:这个推流可以搭配Nginx-rtmp,将test.mp4推流到nginx的rtmp模块,rtmp模块配置了直播流,可以接收rtmp协议的视频流,并自动保存为ts-m3u8的这种格式,相当于视频切片,但与视频切片不同的是,推流生成的m3u8文件没有结束符,导致在nginx中配置vod点播时,无法正常播放,原因也很剪刀,推流的方式是以直播的方式推流的,相当于视频并不会完结,所以并不会添加结束符#EXT-X-ENDLIST。
#处理MP4,将MP4的moov块移动到文件的最前方
ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4
扩展:MP4文件分为以下几个主要部分:moov存储视频的信息,当客户端读取到moov后,才可以播放视频,视频区,音频区,当moov位于视频区后面时,http就会多次请求,知道读取到moov后,才开始播放,这几次请求的响应码为206,代表断点续传,所以MP4本身就是支持边下边播的
二、Nginx-rtmp-module的安装和使用
1、简介
Nginx-rtmp-module是nginx的一个扩展模块,它提供了nginx对于rtmp协议的支持,如果没有nginx则需要在编译之前的时候通过配置指令添加模块,如果已有nginx则需要重新编译,并添加模块
,参考博客 https://www.cnblogs.com/zhangmingda/p/12638985.html
2、配置Nginx-rtmp
rtmp{
server {
#配置监听的端口
listen 1935;
#请求数据块的大小,一般4000足够
chunk_size 4000;
#点播服务器,访问该路径可以以rtmp协议拉流访问play中配置的目录中的视频文件
application vod {
#文件保存地址
play /tmp/vods;
}
#直播回放服务器,配置了live on代表开启直播,hls on代表支持直播回放
application hls{
live on; #开启直播
#record all; #配置记录类型,可以配置音频,视频或全部
#record_path /tmp/flvs; #记录的路径
hls on; #这个参数把直播服务器改造成实时回放服务器。
# wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。
# hls_fragment 2s; #每个视频切片的时长。
hls_playlist_length 24h; #总共可以回看的事件,这里设置的是24小时,过期自动删除。
# hls_continuous on; #连续模式。
# hls_cleanup on; #对多余的切片进行删除。
# hls_nested on; #嵌套模式,配置了此项后,保存的m3u8会被${hls_path}/${fileName}/index.m3u8替换
hls_path /tmp/hls;
# allow play all;
}
}
}
配置了如上以后,就可以使用ffmpeg进行推流了。
配置支持http访问:在http的server下添加如下配置项
location /hls {
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
#以上配置项必加,如下是配置跨域请求,按需添加
add_header 'Access-Control-Allow-Origin' '*';
}
配置好后,用户可以通过http协议访问hls来播放视频
配置好如上两项后,你可以:
1、通过ffmpeg推流到rtmp://ip:1935/hls/test进行直播,然后通过VLC进行rtmp拉流观看直播
2、通过ffmpeg视频切片后将视频文件存放到hls_path/路径下,通过http://ip:80/hls/test.m3u8进行http协议的播放,本质上是观看直播回放,但形式类似于点播
3、通过rtmp协议拉流vod配置项中的路径下的视频文件,好像也可以配置http协议进行播放,感兴趣的可以试一下
三、如上就绪后,最终肯定要回归代码,java代码如何操作ffmpeg进行推流,切片请看下一篇文章
附:所需软件,里面ffmpeg有static静态版本,也有snapshot版本,按需取
链接:https://pan.baidu.com/s/11NPKcWoeFFjJ5lIvEhPP9A
提取码:95f6
复制这段内容后打开百度网盘手机App,操作更方便哦
最后
以上就是矮小海燕为你收集整理的FFmpeg,Nginx-rtmp-module搭建简易的流媒体服务器FFmpeg,Nginx-rtmp-module搭建简易的流媒体服务器的全部内容,希望文章能够帮你解决FFmpeg,Nginx-rtmp-module搭建简易的流媒体服务器FFmpeg,Nginx-rtmp-module搭建简易的流媒体服务器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复