HTTP-FLV详解及分析(一)

简介: HTTP-FLV详解及分析

前言

传统的直播协议要么使用 Adobe 的基于 TCP 的 RTMP 协议, 要么使用 Apple 的基于 HTTP 的 HLS 协议。本文介绍另外一种结合了 RTMP 的低延时, 以及可以复用现有 HTTP 分发资源的流式协议 HTTP-FLV。


一、HTTP-FLV 简介

HTTP-FLV,即将音视频数据封装成 FLV,然后通过 HTTP 协议传输给客户端。

HLS 其实是一个 “文本协议” ,而并非流媒体协议,(ts0,ts1,…)。 那么,什么样的协议才能称之为流媒体协议呢?

答:流(stream):数据在网络上按时间先后次序传输和播放的连续音/视频数据流。之所以可以按照顺序传输和播放连续是因为在类似 RTMP、FLV 协议中,每一个音视频数据都被封装成了包含时间戳信息头的数据包。而当播放器拿到这些数据包解包的时候能够根据时间戳信息把这些音视频数据和之前到达的音视频数据连续起来播放。

MP4、MKV 等等类似这种封装,必须拿到完整的音视频文件才能播放,因为里面的单个音视频数据块不带有时间戳信息,播放器不能将这些没有时间戳信息数据块连续起来,所以就不能实时的解码播放。

1、市场上使用 http-flv 的商家

优酷的 pc 网页直播,斗鱼、 熊猫 tv、 虎牙 pc 网页上也使用了 http-flv

2、http-flv、rtmp 和 hls 直播的优缺点

  • 三者的延迟性
  • http-flv:低延迟,内容延迟可以做到 2-5 秒;
  • Rtmp:低延迟,内容延迟可以做到 2-5 秒。
  • Hls:延迟较高(ts0,segment-time:5,10s)。
  • 三者的易用性
  • rtmp 和 http-flv:播放端安装率高。只要浏览器支持 FlashPlayer 就能非常简易的播放。
  • hls:最大的优点:HTML5 可以直接打开播放;这个意味着可以把一个直播链接通过微信等转发分享,不需要安装任何独立的 APP,有浏览器即可。
  • rtmp 和 http-flv 比较
  • 穿墙:很多防火墙会墙掉 RTMP,但是不会墙 HTTP,因此 HTTP FLV 出现奇怪问题的概率很小。
  • 调度:RTMP 也有个 302,可惜是播放器 as 中支持的,HTTP FLV 流就支持 302 方便 CDN 纠正 DNS 的错误。
  • 容错:SRS 的 HTTP FLV 回源时可以回多个,和 RTMP 一样,可以支持多级热备。
  • 简单:FLV 是最简单的流媒体封装,HTTP 是最广泛的协议,这两个组合在一起维护性更高,比 RTMP 简单多了。

3、http-flv 技术实现

HTTP 协议中有个约定:content-length 字段,http 的 body 部分的长度。

  • 服务器回复 http 请求的时候如果有这个字段,客户端就接收这个长度的数据然后就认为数据传输完成了。
  • 如果服务器回复 http 请求中没有这个字段,客户端就一直接收数据,直到服务器跟客户端的 socket 连接断开。 (流式传输)

http-flv 直播就是利用第二个原理,服务器回复客户端请求的时候不加 content-length 字段,在回复了 http 内容之后,紧接着发送 flv 数据,客户端就一直接收数据了。

二、Nginx 配置 http-flv

1、Windows 安装 nginx,已经集成 nginx-http-flv-module

RTMP 服务器:Nginx+rtmp(windows)的环境搭建如有需要可自取:

链接:https://pan.baidu.com/s/1AcIVERWUPbJL1zu8yCcAzw

提取码:mtdf

2、nginx.conf 配置文件

nginx.conf 配置文件如下:

worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#error_log  logs/error.log  debug;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
# 添加RTMP服务
rtmp {
    server {
        listen 1935; # 监听端口
        chunk_size 4000;
        application live {
            live on;
      gop_cache on;
      hls on;
      hls_path html/hls;
        }
    }
}
# HTTP服务
http {
    include       mime.types;
    default_type  application/octet-stream;
    #access_log  logs/access.log  main;
    server {
        listen       8080; # 监听端口
 
 location /flv {
    flv_live on;
    chunked_transfer_encoding on; 
    add_header 'Access-Control-Allow-Origin' '*';
    add_header "Access-Control-Allow-Credentials" "true";
    add_header "Access-Control-Allow-Methods" "*";
    add_header "Access-Control-Allow-Headers" "Content-Type,Access-Token";
    add_header "Access-Control-Expose-Headers" "*"; 
    }
    location /stat.xsl {
            root html;
        }
    location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
    location / {
            root html;
        }
    }
}

其中涉及到跨域问题:#http-flv

location /flv {
    flv_live on;
    chunked_transfer_encoding on; 
    add_header 'Access-Control-Allow-Origin' '*';
    add_header "Access-Control-Allow-Credentials" "true";
    add_header "Access-Control-Allow-Methods" "*";
    add_header "Access-Control-Allow-Headers" "Content-Type,Access-Token";
    add_header "Access-Control-Expose-Headers" "*"; 
    }

3、运行 nginx 服务器

双击 nginx8080.exe

在任务管理器可以看到目前 nginx 已开始工作

4、ffmpeg 推流

ffmpeg -re -i SampleVideo_1280x720_20mb.mp4 -vcodec libx264 -acodec aac -f flv -y rtmp://127.0.0.1:1935/live/test1
• 1

这个命令使用 FFmpeg 工具来将输入视频文件 SampleVideo_1280x720_20mb.mp4 转换为 FLV 格式并通过 RTMP 协议流式传输到指定的 URL 地址 rtmp://127.0.0.1:1935/live/test1;

  • -re:以实时模式(real-time)读取输入文件,模拟实时流传输的速度。
  • -i SampleVideo_1280x720_20mb.mp4:指定输入文件名为 SampleVideo_1280x720_20mb.mp4。
  • -vcodec libx264:选择 H.264 编码器作为视频编码器;
  • -acodec aac:选择 AAC 编码器作为音频编码器;
  • -f flv:指定输出格式为FLV(Flash Video);
  • -y:自动覆盖输出文件,如果存在同名文件则会被替换;
  • rtmp://127.0.0.1:1935/live/test1:指定输出的 URL 地址,以 RTMP 协议传输到 192.168.36.176 服务器的 1935 端口的 live 应用程序中的 test1 流

5、VLC 播放

  • http-flv:http://localhost:8080/flv?port=1935&app=live&stream=test1
    对应关系如下:

    VLC 进行拉流

  • rtmp:rtmp://127.0.0.1:1935/live/test1

  • Hls:http://localhost:8080/hls/test1.m3u8

此外,视频和音频内容分割为小的 TS 文件,并生成相应的 M3U8 文件,以便客户端能够获取和播放这些文件。M3U8 文件可以通过 HTTP 服务器提供给客户端,并使用流媒体播放器(如VLC、HLS播放器等)进行解析和播放。

这个目录是由 nginx.conf 配置文件决定的:


HTTP-FLV详解及分析(二)https://developer.aliyun.com/article/1472363

目录
相关文章
|
6天前
|
缓存 网络协议 数据库连接
C/S架构中HTTP错误状态码原因分析及解决办法
HTTP(Hypertext Transfer Protocol)是用于在客户端和服务器之间传输数据的协议。当在浏览器或其他HTTP客户端中访问网页时,可能会发生各种访问报错。我们需要根据网页提供的错误状态码分析错误原因,以找到相对应的解决办法。
49 0
|
6天前
|
移动开发 JSON 监控
网络协议解析:在员工上网监控软件中实现HTTP流量分析
随着企业对员工网络活动的监控需求不断增加,开发一套能够实现HTTP流量分析的网络协议解析系统变得愈发重要。本文将深入探讨如何在员工上网监控软件中实现HTTP流量分析,通过代码示例演示关键步骤。
232 0
|
7月前
|
API
SAP Spartacus UI 通过 HTTP Interceptor 给请求添加 Authorization 字段的源代码分析
SAP Spartacus UI 通过 HTTP Interceptor 给请求添加 Authorization 字段的源代码分析
34 1
|
6天前
|
编解码 索引
HTTP-FLV详解及分析(三)
HTTP-FLV详解及分析
32 0
|
6天前
|
内存技术
HTTP-FLV详解及分析(二)
HTTP-FLV详解及分析
30 0
|
6天前
|
网络协议
Wireshark中的http协议包分析
Wireshark可以跟踪网络协议的通讯过程,本节通过http协议,在了解Wireshark使用的基础上,重温http协议的通讯过程。 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网的数据通信的基础。 下图是访问百度页面的头部文件的Wireshark数据包截取图,以下几点说明如下:
Wireshark中的http协议包分析
|
7月前
|
移动开发 网络协议
HTTP/2 协议(抓包分析 HTTP/2 握手是如何被建立的)
HTTP/2 协议(抓包分析 HTTP/2 握手是如何被建立的)
101 0
|
7月前
|
网络协议 索引
HTTP/2 协议(帧、消息、流简单的抓包分析)
HTTP/2 协议(帧、消息、流简单的抓包分析)
127 0
|
7月前
|
Web App开发 XML 应用服务中间件
Http failure response 0 Unknown error 错误分析
Http failure response 0 Unknown error 错误分析
65 0
|
8月前
|
网络协议 安全 前端开发
【JavaWeb】知识总结Ⅷ(HTTP协议, GET请求包, POST请求包, 响应包的分析)
1. http 是 TCP/IP 协议的一个应用层协议,http 也是我们 web 开发的基础. http协议特点: 2.基于请求响应模型的:一次请求对应一次响应 3.http协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的 · 缺点:多次请求之间不能共享数据 (java中使用会话技术解决session、cookie) · 优点:速度快