日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

流媒体协议-- HTTP-FLV

發布時間:2024/3/26 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 流媒体协议-- HTTP-FLV 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HTTP-FLV

  • HTTP-FLV簡介
  • 分塊傳輸編碼
  • 請求響應報文分析


HTTP-FLV簡介

  • 基于HTTP 1.1 分塊傳輸機制(Chunked transfer encoding)實現直播。

  • 客戶端每次請求HTTP-FLV直播流,服務器先發送FLV header、script tag以及audio config tag和video config tag,再發送當前時間點FLV音視頻數據。(一header三tag)

  • HTTP-FLV優缺點:
    優點:
    a. 服務器兼容性好:基于HTTP協議。
    b. 相對低延時:直接傳輸FLV流,傳輸顆粒度小;基于HTTP長連接。(發一次請求,客戶端分多次提供數據)
    缺點:
    a. 播放端兼容性不好:需要flash支持,主流瀏覽器拋棄flash。
    b. 不適合多音軌:flv只能有一條音軌和一條視頻軌。

  • 分塊傳輸編碼

  • 分塊傳輸編碼(Chunked transfer encoding)是HTTP中一種數據傳輸機制,允許客戶端發送一次請求,而服務器將數據分多次發送給客戶端(響應頭只有一個)。
  • 注意跟Range請求是不同的,帶range請求只是規定了傳輸范圍,屬于短連接。
  • 分塊傳輸編碼在HTTP 1.1版本中提供,HTTP 1.0不支持該特性。如果服務器要用分塊傳輸編碼,響應報文中會帶關鍵字 Transfer-Encoding: chunked
  • 原理:
    通常情況下,一次HTTP應答消息中發送的數據是整個發送的,“Content-Length”消息頭字段表示傳輸的數據大小,該字段可以讓客戶端應用判斷數據傳輸何時結束以及后續應答消息的何時開始。而分塊傳輸編碼是將數據切割成一段段的數據塊,每個分塊包含十六進制的長度值和數據,長度值獨占一行,長度不包括該行結尾的 CRLF(\r\n),也不包括分塊數據結尾的CRLF,但是包括數據里面的CRLF。最后一個分塊長度值必須為 0,對應的分塊數據沒有內容,但是必須跟兩個CRLF,表示實體結束,也就是說最后一個分塊為:“0\r\n\r\n”。這樣的話,服務器不需要在發送數據前預先知道發送內容的總大小。
  • 好處:
    HTTP分塊傳輸編碼允許服務器為動態生成的內容維持HTTP持久連接(長連接)。相當于說“Content-Length”無限大,數據的傳輸不會停止,那TCP連接自然一直存在。而直播場景就是屬于典型的“內容動態生成”的實例,這是HTTP-FLV直播實現的基礎。
  • 擴展1:
    分塊傳輸通過改變報文格式來優化傳輸,除此之外,還可以通過“內容編碼”的方式來優化傳輸,方式是對實體內容進行壓縮編碼(如gzip),對應的消息頭部字段是“Content-Encoding”。
  • 擴展2:
    對于客戶端應用,判斷傳輸結束,要關閉tcp連接的方式有兩種:
    i. 通過HTTP響應報文Content-Length字段獲得實體內容的大小,如果接收到的數據與之相等,就認為傳輸結束,關閉連接。
    ii. 通過檢查分塊傳輸編碼的分塊長度,如果是0,那說明傳輸結束,關閉連接。
    h. 報文示例:HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked ---> 接下來的實體內容采用分塊傳輸編碼25 --> 十六進制表示的塊大小,即接下來傳輸37(0x25)字節的實體內容 This is the data in the first chunk (\r\n) --> 空一行,顯式的換行符 1C and this is the second one (\r\n) 3 con 8 sequence 0 --> 傳輸結束 (\r\n) (\r\n) 解析:"This is the data in the first chunk\r\n" (37 字符 => 十六進制: 0x25) "and this is the second one\r\n" (28 字符 => 十六進制: 0x1C) "con" (3 字符 => 十六進制: 0x03) "sequence" (8 字符 => 十六進制: 0x08) 那么解碼后的實體內容為:This is the data in the first chunk and this is the second one consequence
  • 請求響應報文分析

    下面是一份HTTP-FLV 請求-響應的報文:

    GET http: //192.168.0.102:8080/live?port=1935&app=myapp&stream=mystream HTTP/1.1 Host: 192.168.0.102:8080 Accept: */* Accept-Language: zh_CN User-Agent: VLC/3.0.12 LibVLC/3.0.12 Range: bytes=0-HTTP/1.1 200 OK Connection: close Transfer-Encoding: chunked ----> 服務器返回分塊傳輸關鍵字,而不是客戶端請求報文帶的!! Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: * Content-Type: video/x-flv Date: Sun, 07 Mar 2021 08:21:23 GMT Expires: -1 Server: nginx/1.18.02a03 ----> 當前chunk的字節數 FLV..... ................. onMetaData...Server..DNGINX HTTP-FLV (https: //github.com/winshining/nginx-http-flv-module)..width.@.........height.@.........displayWidth.@........ displayHeight.@.........duration.......... framerate.@8........fps.@8....... videodatarate.@.........videocodecid.@........ audiodatarate.@gu.......audiocodecid.@$........profile ....

    傳輸的方式是chunked。
    響應頭后面跟著chunk字節數,以及flv data。

    總結

    以上是生活随笔為你收集整理的流媒体协议-- HTTP-FLV的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。