关于rtmp和flv特别要看这个:
https://zhuanlan.zhihu.com/p/83454344
HTTP-FLV
HTTP-FLV,即将音视频数据封装成 FLV,然后通过 HTTP 协议传输给客户端。
HLS 其实是一个 “文本协议”,而并非流媒体协议。那么,什么样的协议才能称之为流媒体协议呢?
流(stream): 数据在网络上按时间先后次序传输和播放的连续音/视频数据流。之所以可以按照顺序传输和播放连续是因为在类似 RTMP、FLV 协议中,每一个音视频数据都被封装成了包含时间戳信息头的数据包。而当播放器拿到这些数据包解包的时候能够根据时间戳信息把这些音视频数据和之前到达的音视频数据连续起来播放。MP4、MKV 等等类似这种封装,必须拿到完整的音视频文件才能播放,因为里面的单个音视频数据块不带有时间戳信息,播放器不能将这些没有时间戳信息数据块连续起来,所以就不能实时的解码播放。
最近使用到rtmp推流,通过http-flv来播放,今天抓包分析了一下:
通过抓包发现,只有一次http 请求-回复,其余全部为tcp
https://blog.youkuaiyun.com/ai2000ai/article/details/80306735
发现跟上连接的不一致,我抓包只发现一个http请求,没有http回复
这个是10090-》49130发送的第一个66包
如果对wireshark解析TCP的几种状态 (SYN, FIN, ACK, PSH, RST, URG)不了解,可以参考:
https://blog.youkuaiyun.com/u012478275/article/details/99624506
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
抓包结果分析可以看出客户端http请求了服务器一次,
GET /live/ai_1.flv HTTP/1.1
Host: 127.0.0.1:9990
Accept: */*
Accept-Language: en_US
User-Agent: VLC/3.0.9.2 LibVLC/3.0.9.2
Range: bytes=0-
http 服务器回复200ok
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: video/x-flv; charset=utf-8
Date: å
, 4æ 10 2021 11:27:04 GMT
Keep-Alive: timeout=15, max=100
Server: ZLMediaKit-5.0(build in Apr 6 2021 17:05:55)
接着服务器发送flv数据流,关于flv格式可以参考:
https://blog.youkuaiyun.com/tingtings324/article/details/88067671
https://zhuanlan.zhihu.com/p/28722048
(flv签名)
服务器依次发送:
(上面的这个是flv的元文件)
onMetaDatadurationfileSize framerate@9height@~server-ZLMediaKit-5.0(build in Apr 6 2021 17:05:45)videocodecid@width@