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

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

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

相关文章

【Redis】缓存三剑客问题实践(上)

本篇对缓存三剑客问题进行介绍和解决方案说明&#xff0c;下篇将进行实践&#xff0c;有需要的同学可以跳转下篇查看实践篇&#xff1a;&#xff08;待发布&#xff09; 缓存三剑客是什么&#xff1f; 缓存三剑客指的是在分布式系统下使用缓存技术最常见的三类典型问题。它们分…

Flink 2.0 编译

文章目录 Flink 2.0 编译第一个问题 java 版本太低maven 版本太低maven 版本太高开始编译扩展多版本jdk 配置 Flink 2.0 编译 看到Flink2.0 出来了&#xff0c;想去玩玩&#xff0c;看看怎么样&#xff0c;当然第一件事&#xff0c;就是编译代码&#xff0c;但是没想到这么多问…

获取印度股票市场列表、查询IPO信息以及通过WebSocket实时接收数据

为了对接印度股票市场&#xff0c;获取市场列表、查询IPO信息、查看涨跌排行榜以及通过WebSocket实时接收数据等步骤。 1. 获取市场列表 首先&#xff0c;您需要获取支持的市场列表&#xff0c;这有助于了解哪些市场可以交易或监控。 请求方法&#xff1a;GETURL&#xff1a…

云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)

1、CNCF定义与背景 云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;CNCF&#xff09;是由Linux基金会于2015年12月发起成立的非营利组织&#xff0c;旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…

【Rust 精进之路之第5篇-数据基石·下】复合类型:元组 (Tuple) 与数组 (Array) 的定长世界

系列&#xff1a; Rust 精进之路&#xff1a;构建可靠、高效软件的底层逻辑 作者&#xff1a; 码觉客 发布日期&#xff1a; 2025-04-20 引言&#xff1a;从原子到分子——组合的力量 在上一篇【数据基石上】中&#xff0c;我们仔细研究了 Rust 的四种基本标量类型&#xff1…

MongoDB 集合名称映射问题

项目场景 在使用 Spring Data MongoDB 进行开发时&#xff0c;定义了一个名为 CompetitionSignUpLog 的实体类&#xff0c;并创建了对应的 Repository 接口。需要明确该实体类在 MongoDB 中实际对应的集合名称是 CompetitionSignUpLog 还是 competitionSignUpLog。 问题描述 …

物联网 (IoT) 安全简介

什么是物联网安全&#xff1f; 物联网安全是网络安全的一个分支领域&#xff0c;专注于保护、监控和修复与物联网&#xff08;IoT&#xff09;相关的威胁。物联网是指由配备传感器、软件或其他技术的互联设备组成的网络&#xff0c;这些设备能够通过互联网收集、存储和共享数据…

PCB原理图解析(炸鸡派为例)

晶振 这是外部晶振的原理图。 32.768kHz 的晶振&#xff0c;常用于实时时钟&#xff08;RTC&#xff09;电路&#xff0c;因为它的频率恰好是一天的分数&#xff08;32768 秒&#xff09;&#xff0c;便于实现秒计数。 C25 和 C24&#xff1a;两个 12pF 的电容&#xff0c;用于…

Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)

使用 nb_conda_kernels 添加所有环境 一键添加所有 conda 环境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

【JAVA】十三、基础知识“接口”精细讲解!(二)(新手友好版~)

哈喽大家好呀qvq&#xff0c;这里是乎里陈&#xff0c;接口这一知识点博主分为三篇博客为大家进行讲解&#xff0c;今天为大家讲解第二篇java中实现多个接口&#xff0c;接口间的继承&#xff0c;抽象类和接口的区别知识点&#xff0c;更适合新手宝宝们阅读~更多内容持续更新中…

基于MuJoCo物理引擎的机器人学习仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎&#xff0c;能支持多种机器人模型&#xff0c;提供丰富多样的任务场景&#xff0c;像基础的抓取、推物&#xff0c;精细的开门、拧瓶盖等操作。它可灵活配置多种传感器&#xff0c;提供本体、视觉、力 / 触觉等感知数据。因其对强化学习友好&am…

企业微信自建应用开发回调事件实现方案

目录 1. 前言 2. 正文 2.1 技术方案 2.2 策略上下文 2.2 添加客户策略实现类 2.3 修改客户信息策略实现类 2.4 默认策略实现类 2.5 接收事件的实体类&#xff08;可以根据事件格式的参数做修改&#xff09; 2.6 实际接收回调结果的接口 近日在开发企业微信的自建应用时…

Linux将多个块设备挂载到一个挂载点

在 Linux 系统中&#xff0c;直接将多个块设备挂载到同一个挂载点是不可能的。这是因为 Linux 的文件系统挂载机制设计为一个挂载点一次只能关联一个文件系统。如果尝试将多个块设备挂载到同一个挂载点&#xff0c;后一次挂载会覆盖前一次的挂载&#xff0c;导致只有最后挂载的…

Spark-SQL(四)

本节课学习了spark连接hive数据&#xff0c;在 spark-shell 中&#xff0c;可以看到连接成功 将依赖放进pom.xml中 运行代码 创建文件夹 spark-warehouse 为了使在 node01:50070 中查看到数据库&#xff0c;需要添加如下代码&#xff0c;就可以看到新创建的数据库 spark-sql_1…

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

el-select+vue-virtual-scroller解决数据量大卡顿问题

解决el-select中数据量过大时&#xff0c;显示及搜索卡顿问题&#xff0c;及正确的回显默认选中数据 粗略的封装了组件&#xff0c;有需要各种属性自定义的&#xff0c;自己添加设置下 环境 node 16.20.1 npm 8.19.4 vue2、element-ui "vue-virtual-scroller"…

Sqlite3交叉编译全过程

Sqlite3交叉编译全过程 一、概述二、下载三、解压四、配置五、编译六、安装七、验证文件类型八、移植8.1、头文件sqlite3.h8.2、动态链接库移植8.3、静态态链接库移植 九、验证使用9.1. 关键函数说明 十、触发器使用十一、sqlite表清空且恢复id值十二、全文总结 一、概述 SQLi…

软考软件设计师考试情况与大纲概述

文章目录 **一、考试科目与形式****二、考试大纲与核心知识点****科目1&#xff1a;计算机与软件工程知识****科目2&#xff1a;软件设计** **三、备考建议****四、参考资料** 这是一个系列文章的开篇 本文对2025年软考软件设计师考试的大纲及核心内容进行了整理&#xff0c;并…

【数学建模】孤立森林算法:异常检测的高效利器

孤立森林算法&#xff1a;异常检测的高效利器 文章目录 孤立森林算法&#xff1a;异常检测的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步骤一&#xff1a;构建孤立树(iTree)步骤二&#xff1a;构建孤立森林(iForest)步骤三&#xff1a;计算异常分数 3 代码实现…

【Android面试八股文】Android系统架构【一】

Android系统架构图 1.1 安卓系统启动 1.设备加电后执行第一段代码&#xff1a;Bootloader 系统引导分三种模式&#xff1a;fastboot&#xff0c;recovery&#xff0c;normal&#xff1a; fastboot模式&#xff1a;用于工厂模式的刷机。在关机状态下&#xff0c;按返回开机 键进…