干翻全岛蛙蛙 发表于 5 天前

FFmpeg+Nginx+VLC打造M3U8直播

一、视频直播的技术原理和架构方案
直播模子一般包罗三个模块:主播方、服务器端和播放端
https://i-blog.csdnimg.cn/direct/b87070d10bda4c57b4dce2a3b8bf086b.png
主播放创造视频,加美颜、水印、殊效、收罗后推送给直播服务器
播放端:
直播服务器端:收集主播端的视频推流,将其放大后推送给全部观众端,这个是核心功能,还有运营级别的诉求:好比鉴权认证,视频连线和及时转码,自动鉴黄,多屏合一,以及云端录制储存功能,别的对于一恶搞主播端的推流视频,中间必要经过一些环节才气到达播放端,因此对中间的质量进行监控,以及根据这些监控进行智能调治,也是非常紧张的诉求,
二、实现头脑和步调
1、录制---》编码---》网络传输---》解码---》播放
怎样录制直播视频源:手机,ffmpeg
怎样上传直播视频(推到服务器)
怎样播放直播视频
直播间用户是怎样交互(送礼品/谈天室/弹幕)

2、怎样搭建一个完备的视频直播体系
https://i-blog.csdnimg.cn/direct/3dd66fbf9bac477bb828d6bb5f9ba31e.png

3、搭建自己的直播平台
本次测试:
视频收罗与编码:ffmoeg
直播服务Rtmp/hlsRtmp/hls)Nginx+RTMP模块
播放:网页端Video.js(vlc)

服务器上针对nginx进行配置:
https://i-blog.csdnimg.cn/direct/a75bb50a0c13450fa7dc2dcbede265a3.png
执行推流:

ffmpeg -re -i zhiboshipin.mp4 -c copy -f flv rtmp://192.168.1.35:1935/live1/test
注意,这个最后的"test",可以改为test1,test2,......,可以开无数的直播流,
然后在vlc下打开串流观看,地址:
rtmp://192.168.1.35:1935/live1/test
m3u8的观看地址:
http://192.168.1.35:8000/hls1/test.m3u8
这个8000是nginx的端口,
查看服务器上的文件,发现生成了很多ts文件:
https://i-blog.csdnimg.cn/direct/217a1c683ce34bcc9efd5623338c4311.png
分析一下test.m3u8文件,内里存储的是片段:
https://i-blog.csdnimg.cn/direct/978456fd4d4442368fe6ce4074648dda.png
三、搭建Nginx直播服务器
服务器由 Nginx+RTMP构成,Nginx是http服务器,RTMP是附加啊啊啊啊啊啊模块,选择源码的方式安装,可以自定义安装模块

安装Nginx依靠,

apt-get install -y libpcre3 libpcre3-dev libssl-dev zlib1g-dev gcc wget unzip vim make curl

下载源码:
https://github.com/winshining/nginx-http-flv-module
https://i-blog.csdnimg.cn/direct/6c009bb480b84a518b13aca820c685f5.png
中文文档:nginx-http-flv-module/README.CN.md at master · winshining/nginx-http-flv-module · GitHub
wget下载
https://i-blog.csdnimg.cn/direct/54ec5b3df03d438e9922e2e0cd47bd5b.png
解压
unzip master.zip
https://i-blog.csdnimg.cn/direct/9e4d00e6a68041e0bae7f2548892fd6d.png

然后下载nginx自己源码,解压
https://i-blog.csdnimg.cn/direct/41af0023dce942828f78a3fdb4b88948.png
编译安装
https://i-blog.csdnimg.cn/direct/7117b09504734609b74acde400d021d2.png
配置好之后,make makeinstall
要删除掉
Werror
https://i-blog.csdnimg.cn/direct/a3f3a4340d9f4e2ea465d171ef1921ad.png
四、配置rtmp服务器
https://i-blog.csdnimg.cn/direct/cb5af0b560fe43fead59c757098fd2a8.png
启动Nginx,执行下令:
/usr/local/nginx/sbin/nginx
https://i-blog.csdnimg.cn/direct/a5b40a0dd1a14d9eacb244c536d76cb6.png

vod目次下的是点播功能,可以用rtmp协议播放网络文件
https://i-blog.csdnimg.cn/direct/4a508210215f412f983f4d98c7984f73.png

https://i-blog.csdnimg.cn/direct/f185fd91d41d4eb79022cb87aaa24ecb.png
五、搭建FFmpeg,直播推流
下载并安装ffmpeg,
ffmpeg当地文件推流
ffmpeg -re -i input.mp4 -vcodec libx264 -acode aac -f flv -re表现以正常的帧率推流,否则视频很快推完
rtmp://192.168.1.35:1935/hls1/test1
ffmpeg摄像头推流:
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:vzerolatency -f flv rtmp://192.168.1.35/test 六、搭建Videojs,实战网络直播
新建网页,使用第三方播放器( video.js),播放源为:http://192.168.1.35:8080/hls/test1.m3u8
<p><em>Videojs播放直播.</em></p>


<video id="myVideo"class="video-js vjs-default-skin"   preload="auto" width="640" height="264" controls>
       
        <source src="http://192.168.1.35:8080/hls/test1.m3u8" type="application/x-mpegURL">
</video>


<script src="https://vjs.zencdn.net/7.20.3/video.min.js"></script>
    <script>
      const player = videojs('myVideo', {
            html5: {
                hls: {
                  overrideNative: true // 强制使用 video.js 的 HLS 处理
                }
            }
      });
    </script>



</body> 配置 Nginx 以支持 HLS 直播流(.m3u8 和 .ts 文件)并解决跨域题目:
# 在 http 或 server 块中定义 MIME 类型(确保支持 HLS)
http {
    include       mime.types;
    default_typeapplication/octet-stream;

    # 添加 HLS 的 MIME 类型(如果 mime.types 中未定义)
    types {
      application/vnd.apple.mpegurl m3u8;
      video/mp2t ts;
    }

    # 其他全局配置...
}

server {
    listen 80;
    server_name your-domain.com;# 替换为你的域名或 IP

    # HLS 直播流文件路径(根据实际路径调整)
    location /live {
      # 允许跨域请求(CORS)
      add_header 'Access-Control-Allow-Origin' '*' always;
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
      add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;

      # 处理 OPTIONS 预检请求
      if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain; charset=utf-8';
            add_header 'Content-Length' 0;
            return 204;
      }

      # 禁止缓存(直播流需实时更新)
      add_header 'Cache-Control' 'no-cache';

      # 指定文件路径
      alias /path/to/your/hls/files;# 替换为实际存放 m3u8/ts 文件的目录
      autoindex off;# 禁止目录列表

      # 启用高效文件传输(可选)
      sendfile on;
      tcp_nopush on;
    }
}
开始当地推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://192.168.1.35:1935/live/test1 如许就可以顺利在欣赏器观看直播了
七、M3U8的多码流自顺应
low.m3u8
mid.m3u8
high.m3u8
https://i-blog.csdnimg.cn/direct/ceab015488e845d9859bf8bb4f5965fa.png


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: FFmpeg+Nginx+VLC打造M3U8直播