【音视频】Http-FLV 介绍

一、Http-FLV 原理

HTTP-FLV 是基于 HTTP 协议的 FLV(Flash Video)流媒体传输方式。它使用 HTTP 协议而不是传统的 RTMP 协议来传输 FLV 格式的视频流。HTTP-FLV 在 Web 视频直播场景中得到了广泛应用,尤其是在不支持或不希望使用 RTMP 协议的情况下,它为 Web 端用户提供了流畅的直播体验

HTTP-FLV 的核心是 “流式传输”,而非一次性下载文件,依赖两个关键技术:

  • FLV 容器格式:FLV 是轻量级容器,仅包含「文件头(Header)+ 标签(Tag)」两部分,无复杂索引结构。

    Tag 是数据传输的最小单元,分为三类:

    • 视频 Tag(H.264/H.265 编码)
    • 音频 Tag(AAC/MP3 编码):存储实际媒体数据;
    • 脚本 Tag(ScriptTag):包含元数据(如编码格式、分辨率、比特率、时长)
  • HTTP Chunked Encoding(分块编码):HTTP 协议默认是 “请求 - 完整响应”,但 HTTP-FLV 利用 Transfer-Encoding: chunked 响应头,将 FLV 流切分为连续的二进制块(每块 1-2s 数据),服务器实时向客户端推送块,客户端接收后立即解码播放,实现 “边传边播”。

二、Http-FLV 传输过程

HTTP-FLV 需 “推流端 - 流媒体服务器 - 播放端” 三方协作,流程如下:

  1. 推流端:通过 RTMP 协议(如 OBS、FFmpeg)将原始视频流(摄像头 / 本地文件)推送到流媒体服务器(如 SRS、Nginx-RTMP-Module、EasyDarwin),

  2. 服务器转流:服务器接收 RTMP 流后,会实时接收主播推来的视频 / 音频数据(比如通过 RTMP 推流到服务器),并即时封装成 FLV 格式的 “数据单元”,实时封装为 FLV 格式(无需完整生成 FLV 文件),然后,服务器会把这些 FLV 数据按 “1-2 秒的播放时长” 切成一块一块,并通过 HTTP 端口(80/443)对外提供访问地址(如 http://xxx.com/live/stream.flv);

  3. 客户端: 按块处理,收到第一块数据(1-2 秒的 FLV 内容),立即解析其中的 FLV Tag(提取视频帧、音频帧和时间戳),然后调用解码器(比如 H.264 视频解码器、AAC 音频解码器)解码这部分数据,解码完成后直接播放,不用等后续块。同时,客户端会继续接收第二块、第三块… 重复 “接收→解码→播放” 的流程,直到收到 “大小为 0 的空块”(直播结束)。

    • 浏览器通过 flv.js(开源插件)或原生支持 FLV 的播放器(如 Video.js)发起 HTTP GET 请求,获取流地址;
    • 服务器返回 Content-Type: video/x-flv 响应头,以 Chunked 模式持续推送 FLV 数据块;
    • 客户端解析 FLV Tag,分离视频 / 音频数据,通过 HTML5 <video> 标签解码播放。

在这里插入图片描述

三、Http-FLV 对比HLS、本地FLV

3.1 Http-FLV 特点

  • 优势

    • 低延迟:基于 Chunked 传输,延迟通常控制在 1-5 秒(远低于 HLS),适合半实时场景(如电商直播、教育直播);
    • 防火墙穿透:使用 HTTP 标准端口(80/443),避免 RTMP 1935 端口被拦截的问题;
    • 兼容性:原生浏览器虽然不支持,但可以通过 flv.js 库解析,在 Chrome、Firefox、Edge 等现代浏览器运行,移动端也支持。
  • 局限性补充

    • 无原生自适应比特率(ABR):若网络波动,需服务器额外提供多码率流(如 720P/480P),客户端手动切换;
    • 连接稳定性依赖 HTTP 长连接:若网络中断,需重新请求并恢复播放,可能丢失部分数据
    • 它的传输特性会让流媒体资源缓存在本地客户端,也就是说保密性不怎么样;直到目前仍然不兼容iOS的浏览器

3.2 HLS 特点

HLS(HTTP Live Streaming)是苹果推出的基于 HTTP 的自适应比特率流媒体协议,核心是 “切片传输”,与 HTTP-FLV 同为 Web 流媒体主流方案,但技术路径差异显著。

1. HLS 协议简述

  • HLS 将视频流切分为 10-30 秒的 TS 片段(MPEG-TS 格式,支持 H.264/AAC),并生成一个 M3U8 索引文件(文本格式,记录 TS 片段的 URL、时长、码率)。

  • 客户端先请求 M3U8,再按顺序请求 TS 片段播放,支持自动切换不同码率的 M3U8(如网络差时切 480P,网络好时切 1080P)。

2. HTTP-FLV 对比HLS

对比如下

对比维度HTTP-FLVHLS
传输协议HTTP 协议(Chunked Encoding 分块传输)HTTP 协议(基于 TS 切片 + M3U8 索引)
数据格式FLV 容器(Tag 结构,二进制流)TS 片段(MPEG-TS 容器)+ M3U8 索引(文本)
延迟表现低(1-5 秒),适合半实时场景高(15-60 秒),切片越长延迟越高
自适应比特率需额外开发(服务器提供多码率流,客户端切换)原生支持(M3U8 可包含多码率索引,自动切换)
浏览器支持flv.js 插件(Chrome/Firefox/Edge 等)原生支持(Safari 全版本,Chrome/Firefox 需 HLS.js)
设备兼容性支持 Web 端、Android 端;iOS 需第三方播放器全平台支持(iOS 原生支持,Android/Web 需插件)
缓存机制无持久化缓存(流数据实时播放,不存储片段)自动缓存 TS 片段(可离线播放已缓存片段)
带宽适应性固定码率(网络波动易卡顿)动态码率(根据带宽自动切换,抗卡顿能力强)
部署复杂度简单(普通 HTTP 服务器 + 流媒体模块即可)较复杂(需切片工具 + 索引生成 + 多码率管理)
适用场景低延迟直播(电商、教育、会议)高容错直播 / 点播(赛事回放、视频网站点播)

主要差别

  • 延迟是关键分水岭:HTTP-FLV 适合需要 “近实时互动” 的场景(如主播与观众连麦),HLS 适合对延迟不敏感、追求流畅性的场景(如体育赛事直播);
  • 自适应能力:HLS 原生支持 ABR,更适合移动端(网络波动大),HTTP-FLV 需额外开发才能实现类似功能;
  • 兼容性:HLS 在 iOS 端有天然优势(原生支持),HTTP-FLV 在 Web 端(尤其是 PC)部署更简单。
  • HLS 支持加密,通过 “TS 文件加密 + 密钥授权” 的成熟机制实现内容保护,能有效解决 “未加密流被缓存、窃取” 的问题

3.3 本地FLV 特点

本地 FLV 是存储在本地设备(电脑 / 手机)的 FLV 文件(如 video.flv),与 HTTP-FLV(流媒体)的核心差异是 “数据形态与传输方式”,具体对比如下:

1. 本地 FLV 简述

本地 FLV 是完整的文件,包含 FLV Header + 所有 Tag(视频 / 音频 / 脚本),需通过本地播放器(如 VLC、PotPlayer、暴风影音)加载并播放,无需网络传输(除非从本地服务器读取)。其播放逻辑是 “加载文件→解析元数据→按时间戳播放 Tag 数据”,支持进度条拖动、倍速播放等交互。

2. Http-FLV 对比 本地FLV

对比如下:

对比维度HTTP-FLV本地 FLV
数据形态实时流媒体(无完整文件,仅传输数据块)静态文件(完整 FLV 结构,存储在本地设备)
传输方式网络传输(HTTP 分块推送,依赖网络)本地读取(从硬盘 / 内存加载,无网络依赖)
播放机制边传边播(接收一块播放一块,无法提前加载)可完整加载后播放,或本地流式播放(支持拖动进度条)
延迟表现网络延迟(1-5 秒)+ 解码延迟无网络延迟(仅解码延迟,毫秒级)
存储需求服务器存储(实时生成流,不持久化片段)本地存储(需占用设备空间,如 1GB 文件占 1GB 空间)
交互能力弱(仅支持暂停 / 播放,无法拖动进度条)强(支持拖动进度条、倍速、字幕加载等)
播放依赖流媒体服务器 + 浏览器插件(如 flv.js)本地播放器(如 VLC、PotPlayer)
适用场景实时直播(无本地存储需求,需网络)离线播放(下载后观看,如本地视频、离线课程)

主要差异:

  • “流” 与 “文件” 的本质区别:HTTP-FLV 是 “实时生成、实时传输、实时播放” 的流,无完整文件实体;本地 FLV 是 “预生成、本地存储、按需播放” 的文件;
  • 网络依赖性:HTTP-FLV 完全依赖网络(断网即停),本地 FLV 无需网络(下载后可离线播放);
  • 交互体验:本地 FLV 支持完整的点播交互(如拖动进度条),HTTP-FLV 因是实时流,无法跳转播放未传输的内容。

四、协议场景选择

  1. 选 HTTP-FLV 的场景

    • 需低延迟的 Web 直播(如电商直播、在线教育、企业会议);
    • 网络环境严格(仅开放 80/443 端口,需穿透防火墙);
    • 部署资源有限(仅能搭建普通 HTTP 服务器)。
  2. 选 HLS 的场景

    • 对延迟不敏感,但需跨平台(尤其是 iOS 端)的直播 / 点播(如体育赛事、电影点播);
    • 网络波动大的场景(如移动端 4G/5G 环境,需自适应比特率抗卡顿);
    • 需支持离线缓存的场景(如用户希望缓存部分内容稍后观看)。
  3. 选本地 FLV 的场景

    • 离线播放需求(如下载视频后无网络观看);
    • 需高频交互的点播场景(如反复拖动进度条、倍速播放);
    • 无网络环境(如飞机、地铁上的本地视频播放)。

综上,HTTP-FLV 是 “低延迟 Web 直播” 的优选方案,而 HLS 更适合 “跨平台、高容错” 的流媒体场景,本地 FLV 则是 “离线点播” 的经典选择,三者需根据实际需求(延迟、平台、网络)灵活搭配。

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

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

相关文章

uniapp vue页面传参到webview.nvue页面的html或者另一vue中

在app内部使用 uni.$emit(collectiones, { data: gx });传到webview.nvue页面 在webview.nvue页面接受 uni.$on(collectiones, (data) > {console.log(接收到的数据:, data.data);});使用evalJS方法 nvue webview通信示例 这块使用receiveMessageFromNvue方法这样传入的 u…

美团大模型“龙猫”登场,能否重塑本地生活新战局?

美团大模型“龙猫”登场&#xff0c;能否重塑本地生活新战局&#xff1f; 美团大模型登场&#xff1a;行业投下重磅炸弹 在大模型技术迅猛发展的当下&#xff0c;每一次新模型的发布都如投入湖面的石子&#xff0c;激起层层涟漪。美团推出的龙猫大模型 LongCat-Flash&#xff0…

shell(十三)参数代换

shell参数代换xargs. 产生命令的参数1. cut -d : -f 1 /etc/passwd | head -n 3 | xargs finger2. 执行前询问用户cut -d : -f 1 /etc/passwd | head -n 3 | xargs -p finger如果直接按回车就退出3. 指定查阅参数个数cut -d : -f 1 /etc/passwd | xargs -p -n 5 finger4. 指定遇…

Proteus 仿真 + STM32CubeMX 协同开发全教程:从配置到仿真一步到位

为帮助你精准掌握「Proteus 仿真 STM32CubeMXSTM32F103R6」的协同开发流程&#xff0c;本文将聚焦该芯片的特性&#xff0c;从工具适配、分步实操到进阶案例&#xff0c;用富文本格式清晰呈现细节&#xff0c;尤其适合新手入门 32 位单片机开发&#xff1a;ProteusSTM32CubeMX…

WIN10+ubuntu22.04.05双系统装机教程

最近DIY了一台5070TI显卡主机&#xff0c;目的是跑IsaacSim5.0仿真&#xff0c;记录双系统装机过程。 1.Ubuntu22.04.05系统盘制作 参考教程&#xff1a;01_【U盘制作ubuntu22.04启动盘并为电脑安装系统记录】_制作ubuntu22.04安装u盘-CSDN博客 U盘因为是64G的&#xff0c;而…

构建高可用二级缓存系统

二级缓存机制原理详解1. 整体架构MyBatis-Plus二级缓存采用装饰器模式实现&#xff0c;核心组件包括&#xff1a;‌Cache接口‌&#xff1a;定义缓存基本操作‌PerpetualCache‌&#xff1a;基础缓存实现&#xff08;HashMap&#xff09;‌装饰器‌&#xff1a;如LruCache、Fif…

MacOS微信双开,亲测有效

本机配置打开终端运行以下命令 第一步&#xff1a;sudo cp -R /Applications/WeChat.app /Applications/WeChat2.app第二步&#xff1a;sudo /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.tencent.xinWeChat2" /Applications/WeChat2.app/Contents/Info…

Drupal XSS漏洞复现:原理详解+环境搭建+渗透实践(CVE-2019-6341)

目录 一、Drupal XSS漏洞 二、环境搭建 1、确保系统已安装 Docker 和 Docker-Compose 2、下载 Vulhub 3、进入漏洞环境 4、启动漏洞环境 5、查看环境状态 6、初始化Drupal环境 &#xff08;1&#xff09;访问 Drupal 安装页面 &#xff08;2&#xff09;完成图形化安…

Redis复制延迟全解析:从毫秒到秒级的优化实战指南

Redis主从延迟飙升导致数据不一致&#xff1f;订单丢失、缓存穿透频发&#xff1f;本文深入剖析8大复制延迟元凶&#xff0c;并提供解决方案&#xff0c;让你的复制延迟从秒级降到毫秒级&#xff01; 一、复制延迟:分布式系统的隐形杀手 ⚠️ 什么是复制延迟&#xff1f; 当主…

数据预处理与特征工程全流程指南:数据清洗、缺失值填补、类别特征编码、特征缩放归一化、特征选择与降维(PCA/LDA)实战解析

1. 数据预处理与特征工程 “数据清洗、缺失值填补、类别特征编码、特征缩放/归一化、特征选择与降维&#xff08;PCA、LDA&#xff09;” 等流程&#xff0c;虽然被反复提到&#xff0c;但要在复杂的实际数据集中一步步落实&#xff0c;难度很大。 摘要 在机器学习与深度学习…

小迪安全v2023学习笔记(七十九讲)—— 中间件安全IISApacheTomcatNginxCVE

文章目录前记服务攻防——第七十九天中间件安全&IIS&Apache&Tomcat&Nginx&弱口令&不安全配置&CVE中间件 - IIS-短文件&解析&蓝屏等中间件 - Nginx-文件解析&命令执行等常见漏洞介绍漏洞复现中间件 - Apache-RCE&目录遍历&文件…

《云原生微服务治理进阶:隐性风险根除与全链路能力构建》

云原生微服务架构已成为企业支撑业务快速迭代的核心载体&#xff0c;但治理能力的滞后却常常成为制约发展的短板。许多企业在完成服务容器化、部署自动化后&#xff0c;便陷入了“架构先进但治理粗放”的困境—服务数量激增导致依赖关系失控&#xff0c;流量波动加剧引发资源配…

因泰立科技:用激光雷达重塑智能工厂物流生态

应对AGV碰撞困局——激光雷达如何重塑智能工厂物流在现代化工厂中&#xff0c;AGV&#xff08;自动引导车&#xff09;与移动机器人已成为提升生产效率的重要设备。然而&#xff0c;这些智能设备在忙碌的工厂环境中&#xff0c;却时常面临碰撞的困扰。这不仅影响了生产效率&…

Remove.bg:精准自动抠图工具,高效解决图片去背景需求

有没有做设计时被 “抠图去背景” 搞到崩溃的朋友&#xff1f;上次小索奇帮同事做活动海报&#xff0c;要把人物图从复杂背景里抠出来&#xff0c;用 PS 选了半天钢笔工具&#xff0c;头发丝还是漏一块缺一块&#xff0c;折腾半小时都没弄好 —— 后来被设计圈的朋友安利了 Rem…

功率器件固晶挑战:抗高温翘曲治具提升IGBT焊接强度30%

功率器件封装新突破&#xff1a;耐高温防变形工装助力IGBT模块焊接强度提升30%在功率半导体封装领域&#xff0c;IGBT模块的芯片贴装工艺正面临严峻挑战。随着功率密度不断提升&#xff0c;传统固晶工装在高温环境下易发生形变&#xff0c;导致焊接层产生空洞、裂纹等缺陷。最新…

MATLAB可以实现的各种智能算法

MATLAB可以实现的各种智能算法(包括但不限于)中文名称英文全称缩写出现年份算法来由&#xff08;灵感来源&#xff09;遗传算法Genetic AlgorithmGA1975模拟达尔文生物进化论的自然选择和遗传学机理&#xff08;选择、交叉、变异&#xff09;粒子群优化算法Particle Swarm Opti…

【iOS】push,pop和present,dismiss

文章目录前言push和poppresent和dismiss基本方法属性说明常见的用法运行演示push和present区别前言 在之前的学习中&#xff0c;我们发现iOS有两种用于推出新界面的常用方法&#xff0c;分别是push和present&#xff0c;但是二者存在很多区别 present只能返回自己的上一级视图…

编写后端JAR包蓝绿发布脚本

前端发布脚本的功能 保留每一个发布版本&#xff0c;防止新版本异常&#xff0c;方便回撤用户无感知&#xff0c;防止发布过程中的宕机 原理&#xff1a; 发布的JAR包只是一个软连接&#xff0c;新的JAR启动正常后&#xff0c;切换软连接指向即可。蓝绿JAR包绑定端口不同&…

Kafka 和 RabbitMQ的选择

h5打开以查看 选择 Kafka 还是 RabbitMQ&#xff08;或其他传统消息队列&#xff09;并不是一个谁比谁更好的问题&#xff0c;而是 “哪种工具更适合你的特定场景” 的问题。 它们的设计哲学、核心架构和目标用例有根本性的不同。简单来说&#xff1a; RabbitMQ 是一个消息代理…

LeetCode 刷题【66. 加一、67. 二进制求和】

66. 加一 自己做 解&#xff1a;逢十进位 class Solution { public:vector<int> plusOne(vector<int>& digits) {int add 1; //进位vector<int> res(digits.size() 1); //防止多一位的情况&#xff1a;9 1 10for(int i (int)digits…