当前位置: 首页 > news >正文

流媒体服务实现H5实时预览视频

目录

  • 背景
  • 方案
    • 业务实践
    • 细节注意
  • 待办

背景

客户aws服务磁盘存储告急,最高可扩容16T。排查如下:主要是视频文件存在大量复制使用的情况。例如发布节目时复制、预览时复制,这样上传一份视频后最大会有四份拷贝(预览、普通发布、互动发布),但是却有只有一份视频是被终端播放时使用。

方案

预览时,通过ffmpeg工具将原视频处理成video标签可正常播放的音视频流(h264、帧率25以下…参照GTV标准品预览视频格式要求),推送到流媒体服务器上,然后将前端拉该视频流喂给H5的video容器。
在这里插入图片描述

业务实践

FFmpeg支持推流多种形式的流,主要取决于推流协议和容器格式的组合。以下是一些常见的推流形式:

  1. RTMP(Real-Time Messaging Protocol)流:通过RTMP协议推流,可以实现实时音视频流传输。
  2. RTSP(Real-Time Streaming Protocol)流:通过RTSP协议推流,通常用于实时监控和视频流传输。
  3. HLS(HTTP Live Streaming)流:通过HLS协议推流,适用于分段传输和适应不同网络条件的流媒体。
  4. MPEG-TS(MPEG Transport Stream)流:通过MPEG-TS格式推流,常用于数字电视广播和多路复用的流媒体传输。
  5. WebRTC(Web Real-Time Communication)流:通过WebRTC协议推流,用于实时音视频通信和协作。
  6. SRT(Secure Reliable Transport)流:通过SRT协议推流,提供高可靠性和安全性的传输。
  7. UDP(User Datagram Protocol)流:通过UDP协议推流,通常用于低延迟的实时音视频传输。
  8. HTTP/HTTPS流:通过HTTP或HTTPS协议推流,适用于各种在线音视频服务和内容分发。

结合业务需求,以及调用常用方案现状,决定采取RTMP协议推流。
具体方案:FFmpeg (推流) —> (RTMP协议) —>nginx-http-flv-module(流媒体服务) —> (HTTP-FLV) —> Flv.js 。

步骤一:FFmpeg推流
推流命令:ffmpeg -ss 0 -re -i /usr/local/tomcat9.0.41/webapps/cdms//organization/1/video/1/57ffc736-e4bc-4788-b014-8d6c3cb0b908.mp4 -c:v libx264 -c:a aac -f flv -y rtmp://172.18.0.4:1935/live/57ffc736-e4bc-4788-b014-8d6c3cb0b908.mp4-timestamp=1698912705403

步骤二:流媒体服务处理
因为浏览器对rtmp流的支持和兼容性不一样(需要flash插件),所以需要流媒体服务器将rtmp流处理成http类型的流http-flv。

linux环境部署方式:

  1. 编译安装。(不推荐)
    好处:可以自定义功能选项。坏处:对编译环境要求较多,可能会遇到缺库或者版本不对等等一些列问题。
    编译资源及教程: https://github.com/winshining/nginx-http-flv-module
  2. docker镜像安装。(推荐)
    开源docker镜像,人家已经做好编译打包成docker镜像了,只需要自定义启动容器,然后自行修改服务配置即可。
    镜像推荐:mugennsou/nginx-http-flv
    github地址:https://github.com/mugennsou/http-flv
    部署命令:docker pull mugennsou/nginx-http-flv && docker run -it -d --restart always -p 8380:80 -p 1935:1935 --net cdms-network --ip 172.18.0.5 --name allsee-nginx-http-flv mugennsou/nginx-http-flv
    配置路径:/etc/nginx/conf.d/rtmp/rtmp.conf、/etc/nginx/conf.d/http/http.conf
    查看当前正在活动的流:http://ip:8380/stat在这里插入图片描述

步骤三:拉流播放
使用哔哩哔哩开源播放器:flvjs
作用:与流媒体服务建立连接,订阅流地址,实时拉流并喂给video标签进行播放。
在线demo: http://bilibili.github.io/flv.js/demo 根据上述推流过程,拉流播放地址是:http://ip:8380/live?app=live&stream=57ffc736-e4bc-4788-b014-8d6c3cb0b908.mp4-timestamp=1698912705403
项目地址:https://github.com/bilibili/flv.js
在这里插入图片描述

在这里插入图片描述

细节注意

  1. 查看当前正在活动的流 127.0.0.1:1935/stash
  2. 客户量较大,需要注意控制ffmpeg推流并发量。
  3. 客户关闭预览时,销毁推流进程,销毁flvjs播放器。(断开与流媒体服务的连接,释放资源)
  4. 考虑到多个客户对同一个视频进行预览,为了保证每次重新打开预览都是从0开始,每次预览需要保证推流地址不一样。(当前是拼接文件名和时间戳)
  5. 由于历史原因,大部分客户已习惯上传h264格式的mp4文件,这种视频是能通过video原生标签正常播放的,因此预览前需判断视频是否符合正常播放标准(参照GTV标准版视频格式),符合返回文件输出流,否则才走推流播放流程,降低开销。

待办

  1. flvjs自定义参数较多,有空可以再研究研究怎么搭配让播放体验最佳。
  2. 并发预览压测。如何测试巨大的预览并发量对服务器性能的影响。
  3. 流地址暂时采取的是文件名+时间戳,可优化为我们常用的唯一ID获取算法(雪花算法…)

相关文章:

流媒体服务实现H5实时预览视频

目录 背景方案业务实践细节注意 待办 背景 客户aws服务磁盘存储告急,最高可扩容16T。排查如下:主要是视频文件存在大量复制使用的情况。例如发布节目时复制、预览时复制,这样上传一份视频后最大会有四份拷贝(预览、普通发布、互动…...

C++适配器

文章目录 引言栈和队列 priority_queue仿函数迭代器区间 引言 栈的特性是先进后出,队列的特性是先进先出,然而双向队列同时具有栈和队列的特性,所以我们可以通过双向队列来适配出栈和队列。 先看库里面 栈和队列 stack和queue模板参数里面都…...

基于openresty waf二次开发多次匹配到的ip再做拉黑

我们想在openresty waf的基础上做二次开发,比如再精确一些。比如我们先匹配到了select的url我们先打分10分,匹配到cc 1000/s我们再给这个ip打10分…直到100分我们就拉黑这个ip。 [openresty waf][1] #cat reids_w.lua require lib local redis require…...

新一代构建工具Vite-xyphf

一、什么vite? vite:是一款思维比较前卫而且先进的构建工具,他解决了一些webpack解决不了的问题——在开发环境下可以实现按需编译,加快了开发速度。而在生产环境下,它使用Rollup进行打包,提供更好的tree-shaking、代码压缩和性能优化&…...

Flink源码解析三之执行计划⽣成

JobManager Leader 选举 首先flink会依据配置获取RecoveryMode,RecoveryMode一共两两种:STANDALONE和ZOOKEEPER。 如果用户配置的是STANDALONE,会直接去配置中获取JobManager的地址如果用户配置的是ZOOKEEPER,flink会首先尝试连接zookeeper,利用zookeeper的leadder选举服务发现…...

Flutter 常见错误记录总结

1、当 flutter pub get 指令报如下错误时: pub get failed command: "/Users/***/developer/flutter/bin/cache/dart-sdk/bin/dart __deprecated_pub --color --directory . get --example" pub env: { "FLUTTER_ROOT": "/Users/***/dev…...

[ASP]校无忧在线报名系统 v2.1

校无忧在线报名系统为了满足各地不同的报名人员的需求,为提供更为高效、方便、快捷的报名条件,同时也为减轻管理人员的工作难度;更为协调报名人员与管理人员的关系,快速提高了报名人员与管理人员的工作效率应运而生。系统适用于政…...

【Hydro】部分基流分割方法及程序代码说明

目录 说明一、数字滤波法单参数数字滤波Lyne-Hollick滤波法Chapman滤波法Chapman-Maxwell滤波法Boughton-Chapman滤波法 双参数滤波法Eckhardt滤波法 二、其他基流分割方法基流指数(BFI)法时间步长(HYSEP)法PART法加里宁-阿里巴扬…...

C#Regex正则表达式(Regular Expression)

在C#中,Regex是正则表达式(Regular Expression)的缩写,它是一种强大的文本匹配和处理工具。正则表达式是一种用于描述模式的字符串,它可以用来在文本中查找、替换和提取满足特定模式的内容。 在C#中,你可以…...

Wi-Fi还可以做什么?柯南解释IOT应用

大会报告:无线人工智能技术正在改变世界 Wi-Fi还可以做什么?随着带宽的提升,无线终端可以识别出更多的多径,每条多径都可以视作一个虚拟传感器,以感知周边环境。基于此,越来越多的无线感知产品应运而生。20…...

centos部署java程序

后台启动java程序 nohup java -jar -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/app1/logs/ /data/app1.jar --spring.config.location/data/app1/config/application.properties,/data/app1/config/application-dev.properties > /data/app1/logs 2>&1…...

Sqoop导入到Hive,Hive使用 HA

Sqoop写入Hive卡在连接Hive的JDBC上不执行 Sqoop访问 启用 HA模式的Hive 找到Hive的安装根目录&#xff1a;$HIVE_HOME/conf 创建一个新的配置文件&#xff1a;beeline-hs2-connection.xml <?xml version"1.0"?> <?xml-stylesheet type"text/xsl…...

[笔记] %的含义

取模 不赘述。 引导符 重点说一下在printf("%d", n);中的意思。 这里的意思是&#xff1a;将""外对应位置的结果返回给引导符所在的位置&#xff0c; %后面跟着的是结果对应的数据类型&#xff0c; 只有数据类型匹配才能正确输出结果。...

FRI及相关SNARKs的Fiat-Shamir安全

1. 引言 本文主要参考&#xff1a; Alexander R. Block 2023年论文 Fiat-Shamir Security of FRI and Related SNARKsAlbert Garreta 2023年9月在ZK Summit 10上分享 ZK10: Fiat-Shamir security of FRI and related SNARKs - Albert Garreta (Nethermind) 评估参数用的Sage…...

TensorFlow案例学习:使用 YAMNet 进行迁移学习,对音频进行识别

前言 上一篇文章 TensorFlow案例学习&#xff1a;简单的音频识别 我们简单学习了音频识别。这次我们继续学习如何使用成熟的语音分类模型来进行迁移学习 官方教程&#xff1a; 使用 YAMNet 进行迁移学习&#xff0c;用于环境声音分类 模型下载地址&#xff08;需要科学上网&…...

MySQL CHAR 和 VARCHAR 的区别

文章目录 1.区别1.1 存储方式不同1.2 最大长度不同1.3 尾随空格处理方式不同1.4 读写效率不同 2.小结参考文献 在 MySQL 中&#xff0c;CHAR 和 VARCHAR 是两种不同的文本数据类型&#xff0c;CHAR 和 VARCHAR 类型声明时需要指定一个长度&#xff0c;该长度指示您希望存储的最…...

虚拟机 ping: www.baidu.com:未知的名称或服务

1、打开ifcfg-ens33文件 vi /etc/sysconfig/network-scripts/ifcfg-ens332、如下&#xff0c;加上网关和dns就行了&#xff0c;紫色部分&#xff0c;也就是DNS1“114.114.114.114” TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTP…...

第二章 Python字符串处理

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…...

混合编程 ATPCS规范及案例(汇编调用C、C调用汇编、内联汇编)

1.混合编程的规范 2.汇编调用C 2.C调用汇编 3.内联汇编 例子&#xff1a;...

使用Gorm进行CRUD操作指南

使用GORM在Go中创建、读取、更新和删除记录的逐步教程 在数据库管理中&#xff0c;CRUD操作是应用程序的支柱&#xff0c;它们使数据的创建、检索、更新和删除成为可能。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性&#xff0c;使这些操作变得轻松。本文将作为您全面指…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...