草庐IT

常见直播协议介绍:RTMP、HTTP-FLV、HLS

丞恤猿 2023-04-20 原文

#.推流协议:

1. RTMP协议(Real Time Message Protocol,实时信息传输协议)
    由Adobe公司提出的一种应用层的协议,可用于实时传递音视频媒体数据。它基于传输层的TCP协议,通过与服务端建立长连接来传递数据。相较于其它同类协议,传输稳定,延迟较低,一般在1~3s,非常适合用于直播场景下的推流。
    当前手机app端只要是使用该协议来推流。
1.1 RTMPS:  RTMP的变种,使用HTTPS协议来传输数据,支持数据加密。
(可使用Rtmpdump库来进行Rtmp推流,Rtmpdump库也支持Rtmps,但打包时需要Openssl和zib库的支持。)    

#.拉流协议:

1.HTTP-FLV
延迟较低,一般1~3s
由Adobe公司主推, HTTP-FLV 是 Http和Flv的结合体。在服务器端将推流端发送过来的视频帧和音频帧封装成flv格式,然后通过HTTP协议传输给拉流端,在传输层也是使用TCP协议。延迟较低,非常适合用于手机APP端拉流。
Flv格式:Adobe公司推出的一种媒体封装格式,用于封装H264+AAC编码帧。
包括文件头和文件体两大部分,文件头中包含了数据编码的相关信息,文件体由很多tag单元组成,每个tag单元中包含一个tag header(记录音频/视频类型、大小、时间戳等)和tag data(存储媒体数据)。
2.HLS
    HLS(HTTP Live Streaming)是由苹果公司推出的的基于 HTTP 的流媒体网络传输协议。
延迟较高,一般10~30s。
    它的工作原理当采集推流端将视频流推送到流媒体服务器时,服务器将收到的流信息每缓存一段时间就封包成一个新的 ts 文件,同时服务器会建立一个 m3u8 的索引文件来维护最新几个 ts 片段的索引。拉流端通过m3u8 索引文件获知需要的 ts 视频文件片段,通过HTTP协议请求这些片段。因为一个ts片段一般5~10s一个,在服务端要“攒够”足够长的数据才能下发给拉流端,所以延迟较长。
    延迟较高,不太适合用于直播场景。但很适合做回放点播,点播时服务端已经有了这些视频数据,不需要“攒数据”的时间。
3. RTMP协议(Real Time Message Protocol,实时信息传输协议)
    虽然延迟较低(1~3s),但很多播放器不支持。国内的CDN也主要支持HTTP-FLV和HLS协议拉流。 而在 浏览器端需要 FlashPlayer支持 ,但 FlashPlayer也已被主流浏览器禁用。( Ijkplayer官方版本也不支持,需要自己修改扩展功能后才能支持。)
   
##.相关介绍: Http vs Https安全性
1.Http协议
1.1 Http是明文传递,没有加密,数据在中间被捕获后可被窃取和篡改;
  (即使使用了加密,在秘钥传输阶段,秘钥本身就可能被窃取。除非不用网络传输秘钥,本来双方就线下约定好了。)
1.2 Http没有很好的身份验证方式,客户端无法有效安全判断服务端身份,无法防范“中间人攻击”。(中间人攻击: 攻击者与通讯的两端分别创建独立的联系,交换所收到的双方数据,使通讯两端认为他们进行一个私密的连接与对方直接通话,而实际上数据可被中间人获取和篡改 )。
2.Https协议
     Https即Http协议+SSL/TSL协议,通过SSL/TLS协议来验证服务端身份,约定后继通信中的秘钥,这个过程使用非对称加密。
    然后后继利用这个秘钥使用对称加密来通信。
大概过程:
1.开始时,客户端的请求到达服务器端, 服务端返回自己的公钥证书给客户端
(使用非对称加密算法生成公钥和私钥,可以向CA机构申请SSL证书,也可以用自签名方式自己生成。)
2.客户端验证公钥证书可靠性,确认服务端身份无误后,生成后继通信用的key,用服务端公钥加密后发送给服务端。
(因为只有服务端拥有对应的私钥,即使被截获,监听者也无法解密出这个key。
(如果公钥证书是CA机构签发的,可用CA的公钥来验证;如果是自签名的,就要客户端来选择是否信任了。)
3.服务端用自己的私钥解密出这个key,后继使用这个key做秘钥,与客户端之间进行对称加密通信。 二者之间的数据都通过该key加密和解密。
相关笔记: Android签名概要总结——对称加密/非对称加密、数字签名、公钥证书、ca认证机构、安卓app签名_丞恤猿的博客-CSDN博客_android签名加密方式

有关常见直播协议介绍:RTMP、HTTP-FLV、HLS的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  7. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  8. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  9. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  10. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

随机推荐