FFmpeg+Nginx+VLC打造M3U8直播
一、视频直播的技术原理和架构方案
直播模型一般包括三个模块:主播方、服务器端和播放端

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

相关文章:
FFmpeg+Nginx+VLC打造M3U8直播
一、视频直播的技术原理和架构方案 直播模型一般包括三个模块:主播方、服务器端和播放端 主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器 播放端: 直播服务器端:收集主播端的视频推流,将其放大后推送给…...
在 Debian 10.x 安装和配置 Samba
1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …...
基础(测试用例:介绍,测试用例格式,案例)
目录 测试用例介绍 测试用例编写格式 案例 测试用例介绍 用例:用户使用软件的案例场景 测试用例:是为测试项目而设计的测试执行文档 测试用例的作用: 防止漏测是实施测试的标准可以作为测试工作量的评估 测试用例编写格式 用例编号 用例…...
C++学习:六个月从基础到就业——内存管理:RAII原则
C学习:六个月从基础到就业——内存管理:RAII原则 本文是我C学习之旅系列的第十九篇技术文章,也是第二阶段"C进阶特性"的第四篇,主要介绍C中的RAII原则及其在资源管理中的应用。查看完整系列目录了解更多内容。 引言 在…...
Windows串口通信
Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...
bert项目解析
数据预处理 读取csv数据集 def read_file(file_path):data []label []with open(file_path, "r", encoding"utf-8") as file:reader csv.reader(file)next(reader) # 跳过标题行# row每一行用英文逗号分割成列表[标签,文本] 所以标签和文本用英文逗…...
Linux `init` 相关命令的完整使用指南
Linux init 相关命令的完整使用指南—目录 一、init 系统简介二、运行级别(Runlevel)详解三、常用 init 命令及使用方法1. 切换运行级别2. 查看当前运行级别3. 服务管理4. 紧急模式(Rescue Mode) 四、不同 Init 系统的兼容性1. Sy…...
【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba、Long Short Term Memory (LSTM)、xLSTM)
项目源码地址:https://github.com/ImagineAILab/ai-by-hand-excel.git 一、RNN 1. RNN 的核心思想 RNN 的设计初衷是处理序列数据(如时间序列、文本、语音),其核心特点是: 隐藏状态(Hidden Stateÿ…...
嵌入式音视频开发指南:从MPP框架到QT实战全解析
嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...
构建专业金融图表系统的高效路径——QtitanChart在金融行业的应用价值
QtitanChart是一个C 库,它代表一组控件,这些控件使您可以快速轻松地为应用程序提供漂亮而丰富的图表。QtitanChart在Qt.C 上实现,并且支持所有主要的桌面操作系统 - Windows、Linux和Mac OSX。要将QtitanChart添加到您的程序中,只…...
如何通过window端来ssh连接本地虚拟机的ubuntu
首先在 Ubuntu 虚拟机上安装和配置 SSH 服务: # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动,则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…...
问题:el-tree点击某节点的复选框由半选状态更改为全选状态以后,点击该节点展开,懒加载出来子节点数据以后,该节点又变为半选状态
具体问题场景: 用户点击父节点复选框将其从半选变为全选(此时子节点尚未加载)。 点击节点展开触发懒加载,加载子节点。 子节点加载后,组件重新计算父节点状态,发现并非所有子节点被选中,因此父节…...
【Rust 精进之路之第8篇-工具赋能】深入 Cargo:依赖管理、构建配置与工作空间 (Workspace)
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:超越构建,Cargo 是 Rust 生态的引擎 在我们的 Rust 学习之旅初期(第二篇),我们已经与 Cargo 有过初步的接触。我们学会了使用 cargo new 创建项目骨架,用 cargo build 编…...
多模态大语言模型arxiv论文略读(二十六)
Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文标题:Holistic Autonomous Driving Understanding by Bird’s-Eye-View Injected Multi-Modal Large Models ➡️ 论文作者:Xinpeng Ding,…...
Java虚拟机(JVM)平台无关?相关?
计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即,输入参数,根据程序计算,输出结果。图灵机模型如图。 Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。 目前使…...
Ubuntu 安装 Docker 教程(官方推荐方式)
✅ 步骤 1:卸载旧版本(如果有) for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done---### ✅ 步骤 2:更新 APT 索引并安装依赖项bash sudo a…...
Win10 C盘空间不足清理方法
当Windows 10系统的C盘空间不足时,可以采取以下方法进行清理: 1. 清理临时文件 打开“设置” > “系统” > “存储”。 点击“临时文件”,勾选要删除的临时文件、系统缓存等,然后点击“删除文件”。 2. 使用磁盘清理工具…...
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 大算法模型
在机器学习领域,算法模型是解决实际问题的核心工具。 不同的算法适用于不同的数据场景和任务需求,理解它们的原理与应用是掌握机器学习的关键。 以下将详细解析 18 个核心算法模型,涵盖监督学习、无监督学习、集成学习和深度学习等多个领域…...
线性代数 | 知识点整理 Ref 1
注:本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载,本篇为 Ref 1。 略作重排,未整理去重。 图片清晰度限于引文原状。 如有内容异常,请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…...
【深度学习入门_NLP自然语言处理】序章
本部分开始深度学习第二大部分NLP章节学习,找了好多资料,终于明确NLP的学习目标了,介于工作之余学习综合考量,还是决定以视频学习为主后期自主实践为主吧。 分享一个总图,其实在定位的时候很迷茫,单各章节…...
Windows常用维护命令
系统信息查询 systeminfo:查看系统详细信息,如操作系统版本、处理器信息、内存配置等。hostname:显示计算机名称。ver:显示 Windows 版本。 网络诊断 ipconfig:查看 IP 配置,如 IP 地址、子网掩码、网关等。…...
Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇
各位Java开发者们好!🚀 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主,今天我将带大家深入探索Java生态即将迎来的5大技术趋势,特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗ÿ…...
IcePlayer音乐播放器项目分析及学习指南
IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...
蓝桥杯 二进制问题 刷题笔记
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…...
20. git diff
基本概述 git diff的作用是:比较代码差异 基本用法 1.工作区 VS 暂存区 git diff [file]2.暂存区 VS 最新提交 git diff --staged [file] # 或 git diff --cached [file]3.工作区 VS 最新提交 git diff HEAD [file]高级用法 1.比较两个提交间的差异 git dif…...
深入剖析 MySQL 中用户授权机制及操作
在数据库管理的庞大体系中,MySQL 作为一款广泛应用的开源关系型数据库管理系统,其用户授权机制对于保障数据安全、确保数据库稳定运行以及满足多样化的业务需求起着举足轻重的作用。当我们遭遇 “Access denied for user icoolkj% to database icoolkj-a…...
mapbox基础,加载视频到地图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀加载视频到…...
synchronized 与分布式锁
1. synchronized 关键字 定义: synchronized 是 Java 提供的一个内置锁机制,用于控制多线程对共享资源的并发访问。 它可以修饰方法或代码块,确保同一时刻只有一个线程可以执行被 synchronized 修饰的代码。作用范围: 只能用于单…...
