FFmpeg+Nginx+VLC打造M3U8直播

news2025/4/22 0:15:30

一、视频直播的技术原理和架构方案

直播模型一般包括三个模块:主播方、服务器端和播放端

主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器

播放端:

直播服务器端:收集主播端的视频推流,将其放大后推送给所有观众端,这个是核心功能,还有运营级别的诉求:比如鉴权认证,视频连线和实时转码,自动鉴黄,多屏合一,以及云端录制储存功能,另外对于一恶搞主播端的推流视频,中间需要经过一些环节才能达到播放端,因此对中间的质量进行监控,以及根据这些监控进行智能调度,也是非常重要的诉求,

二、实现思想和步骤

1、录制---》编码---》网络传输---》解码---》播放

如何录制直播视频源:手机,ffmpeg

怎样上传直播视频(推到服务器)

怎样播放直播视频

直播间用户是如何交互(送礼物/聊天室/弹幕)

2、如何搭建一个完整的视频直播系统

3、搭建自己的直播平台

本次测试:

视频采集与编码:ffmoeg

直播服务Rtmp/hlsRtmp/hls)Nginx+RTMP模块

播放:网页端Video.js(vlc)

服务器上针对nginx进行配置:

执行推流:

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文件:

分析一下test.m3u8文件,里面存储的是片段:

三、搭建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

中文文档:nginx-http-flv-module/README.CN.md at master · winshining/nginx-http-flv-module · GitHub

wget下载

解压

unzip master.zip

然后下载nginx本身源码,解压

编译安装

配置好之后,make makeinstall

要删除掉

Werror

四、配置rtmp服务器

启动Nginx,执行命令:

/usr/local/nginx/sbin/nginx

vod目录下的是点播功能,可以用rtmp协议播放网络文件

五、搭建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_type  application/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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows串口通信

Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…

【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba、Long Short Term Memory (LSTM)、xLSTM)

项目源码地址&#xff1a;https://github.com/ImagineAILab/ai-by-hand-excel.git 一、RNN 1. RNN 的核心思想 RNN 的设计初衷是处理序列数据&#xff08;如时间序列、文本、语音&#xff09;&#xff0c;其核心特点是&#xff1a; 隐藏状态&#xff08;Hidden State&#xff…

构建专业金融图表系统的高效路径——QtitanChart在金融行业的应用价值

QtitanChart是一个C 库&#xff0c;它代表一组控件&#xff0c;这些控件使您可以快速轻松地为应用程序提供漂亮而丰富的图表。QtitanChart在Qt.C 上实现&#xff0c;并且支持所有主要的桌面操作系统 - Windows、Linux和Mac OSX。要将QtitanChart添加到您的程序中&#xff0c;只…

多模态大语言模型arxiv论文略读(二十六)

Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文标题&#xff1a;Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文作者&#xff1a;Xinpeng Ding,…

Java虚拟机(JVM)平台无关?相关?

计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即&#xff0c;输入参数&#xff0c;根据程序计算&#xff0c;输出结果。图灵机模型如图。 Tape是输入数据&#xff0c;Program是针对这些数据进行计算的程序&#xff0c;中间横着的方块表示的是机器的状态。 目前使…

cloudstudio学习笔记之openwebui

代码获取 git clone 参考资料 openwebui官网 https://docs.openwebui.com/getting-started/advanced-topics/development 后端启动 cd backend pip install -r requirements.txt -U sh dev.sh后端启动成功后的界面 在cloudstudio提供的vscode弹出的提示中打开浏览器并在末…

7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…

机器学习核心算法全解析:从基础到进阶的 18 大算法模型

在机器学习领域&#xff0c;算法模型是解决实际问题的核心工具。 不同的算法适用于不同的数据场景和任务需求&#xff0c;理解它们的原理与应用是掌握机器学习的关键。 以下将详细解析 18 个核心算法模型&#xff0c;涵盖监督学习、无监督学习、集成学习和深度学习等多个领域…

线性代数 | 知识点整理 Ref 1

注&#xff1a;本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载&#xff0c;本篇为 Ref 1。 略作重排&#xff0c;未整理去重。 图片清晰度限于引文原状。 如有内容异常&#xff0c;请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…

【深度学习入门_NLP自然语言处理】序章

本部分开始深度学习第二大部分NLP章节学习&#xff0c;找了好多资料&#xff0c;终于明确NLP的学习目标了&#xff0c;介于工作之余学习综合考量&#xff0c;还是决定以视频学习为主后期自主实践为主吧。 分享一个总图&#xff0c;其实在定位的时候很迷茫&#xff0c;单各章节…

蓝桥杯 二进制问题 刷题笔记

8.二进制问题 - 蓝桥云课 存入N的二进制每一位作为基准数组 算出方案数 从高位往低位用dfs枚举每一位是放1还是放0 #include<iostream> #include<vector> #define ll long long using namespace std;ll dp[65][65]; ll num; ll k; vector<ll> vec;ll cal(l…

mapbox基础,加载视频到地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀加载视频到…

RNN - 循环神经网络(实现)

写在前面 在RNN - 循环神经网络&#xff08;概念介绍&#xff09;中&#xff0c;介绍了一下 RNN 的相关概念&#xff0c;下面就基于概念对 RNN 进行两种实现。从零开始实现和简洁实现。 从 0 开始实现 首先导入必要的环境&#xff0c;使用 H.G.Wells 的时光机器数据集上训练…

【unity游戏开发入门到精通——UGUI】RectTransform矩形变换组件

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、RectTransform组件介绍二、RectTransform组件参数1、Pivot 轴心点2、Ancho…

C语言复习笔记--字符函数和字符串函数(上)

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了 ⼀系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 首先来看下字符函数. 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#xf…

Apipost,前端后端测试都在用的接口设计调试工具

大家好&#xff0c;我是袁庭新。给大家介绍一个后端、前端、测试都在用的接口测试工具——Apipost。Apipost主要分为5个大模块&#xff0c;贯穿一个API从设计到测试完成上线的研发全周期。 1.Apipost介绍 Apipost官方地址&#xff1a;https://www.apipost.cn。如下图所示。 A…

十倍开发效率 - IDEA 插件之RestfulBox - API

提高效率不是为了完成更多的任务&#xff0c;而是有充足的时间摸鱼。 快速体验 RestfulBox - API 是 IDEA 的插件&#xff0c;适合本地测试接口&#xff0c;完全不需要对项目进行任何以来。 接口管理&#xff1a;支持接口扫描、浏览、搜索、跳转、导入和导出。支持接口请求&a…

2025 年网络安全的挑战与机遇

2024 年是网络安全领域风云变幻的一年。从备受瞩目的勒索软件攻击所带来的影响&#xff0c;到人工智能工具日益商品化&#xff0c;挑战不断增加。 关键基础设施的漏洞变得极为明显&#xff0c;身份盗窃次数也达到了前所未有的程度。然而&#xff0c;在这一片混乱之中&#xff…

IP数据报

IP数据报组成 IP数据报&#xff08;IP Datagram&#xff09;是网络中传输数据的基本单位。 IP数据报头部 版本&#xff08;Version&#xff09; 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”&#xff0c;IPv6版本是“6”。 头部长度&#xff08;IHL&#xff0c;Intern…

【Lua语言】Lua语言快速入门

初始Lua Lua是一种轻量小巧的脚本语言&#xff0c;他使用标准C语言编写并以源代码形式开放。这意味着Lua虚拟机可以很方便的嵌入别的程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。同时&#xff0c;在目前脚本引擎中&#xff0c;Lua的运行速度占有绝对优势。 变…