You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/rtsp/rtsp.go

109 lines
5.0 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// Copyright 2020, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package rtsp
import "errors"
// 注意正在学习以及实现rtsp请不要使用这个package
// TODO chef
// - 支持tcp协议
// - pub_session生命周期如何结束
// - pub_session超时
var ErrRTSP = errors.New("lal.rtsp: fxxk")
const (
MethodOptions = "OPTIONS"
MethodAnnounce = "ANNOUNCE"
MethodSetup = "SETUP"
MethodRecord = "RECORD"
MethodTeardown = "TEARDOWN"
MethodDescribe = "DESCRIBE"
MethodPlay = "PLAY"
)
const (
HeaderFieldCSeq = "CSeq"
HeaderFieldTransport = "Transport"
)
var (
// TODO chef: 参考协议标准,不要使用固定值
sessionID = "191201771"
minServerPort = uint16(8000)
maxServerPort = uint16(16000)
composerItemMaxSize = 1024
)
// ffmpeg -re -stream_loop -1 -i /Volumes/Data/tmp/test.flv -acodec copy -vcodec copy -f rtsp rtsp://localhost:5544/live/test110
// read http request. method=ANNOUNCE, uri=rtsp://localhost:5544/live/test110, headers=map[CSeq:2 Content-Length:481 Content-Type:application/sdp User-Agent:Lavf57.83.100], body=v=0
// o=- 0 0 IN IP6 ::1
// s=No Name
// c=IN IP6 ::1
// t=0 0
// a=tool:libavformat 57.83.100
// m=video 0 RTP/AVP 96
// b=AS:212
// a=rtpmap:96 H264/90000
// a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAIKzZQMApsBEAAAMAAQAAAwAyDxgxlg==,aOvssiw=; profile-level-id=640020
// a=control:streamid=0
// m=audio 0 RTP/AVP 97
// b=AS:30
// a=rtpmap:97 MPEG4-GENERIC/44100/2
// a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1210
// a=control:streamid=1
// - server.go:90
// read http request. method=SETUP, uri=rtsp://localhost:5544/live/test110/streamid=0, headers=map[CSeq:3 Transport:RTP/AVP/UDP;unicast;client_port=16366-16367;mode=record User-Agent:Lavf57.83.100], body= - server.go:90
// read http request. method=SETUP, uri=rtsp://localhost:5544/live/test110/streamid=1, headers=map[CSeq:4 Session:191201771 Transport:RTP/AVP/UDP;unicast;client_port=16368-16369;mode=record User-Agent:Lavf57.83.100], body= - server.go:90
// read http request. method=RECORD, uri=rtsp://localhost:5544/live/test110, headers=map[CSeq:5 Range:npt=0.000- Session:191201771 User-Agent:Lavf57.83.100], body= - server.go:90
// read http request. method=TEARDOWN, uri=rtsp://localhost:5544/live/test110, headers=map[CSeq:6 Session:191201771 User-Agent:Lavf57.83.100], body= - server.go:90
// VLC rtsp://127.0.0.1:5544/vlc
// handleTCPConnect. conn=0xc000010030 - server.go:50
// requestLine=OPTIONS rtsp://127.0.0.1:5544/vlc RTSP/1.0, headers=map[CSeq:2 User-Agent:LibVLC/3.0.8 (LIVE555 Streaming Media v2016.11.28)] - server.go:58
// requestLine=DESCRIBE rtsp://127.0.0.1:5544/vlc RTSP/1.0, headers=map[Accept:application/sdp CSeq:3 User-Agent:LibVLC/3.0.8 (LIVE555 Streaming Media v2016.11.28)] - server.go:58
// EOF - server.go:55
// handleTCPConnect. conn=0xc000010038 - server.go:50
// requestLine=SETUP rtsp://127.0.0.1:5544/vlc RTSP/1.0, headers=map[CSeq:0 Transport:RTP/AVP;unicast;client_port=9300-9301] - server.go:58
// requestLine=PLAY rtsp://127.0.0.1:5544/stream=0 RTSP/1.0, headers=map[CSeq:1 Session:47112344] - server.go:58
// ffmpeg -re -stream_loop -1 -i /Volumes/Data/tmp/test.flv -c copy -f rtsp rtsp://localhost:5544/test110
// INFO start hls server listen. addr=:5544 - server.go:37
// DEBUG handleTCPConnect. conn=0xc000010030 - server.go:52
// DEBUG requestLine=OPTIONS rtsp://localhost:5544/test110 RTSP/1.0, headers=map[CSeq:1 User-Agent:Lavf57.83.100] - server.go:60
// INFO < R OPTIONS - server.go:85
// DEBUG requestLine=ANNOUNCE rtsp://localhost:5544/test110 RTSP/1.0, headers=map[CSeq:2 Content-Length:481 Content-Type:application/sdp User-Agent:Lavf57.83.100] - server.go:60
// DEBUG body=v=0
// o=- 0 0 IN IP6 ::1
// s=No Name
// c=IN IP6 ::1
// t=0 0
// a=tool:libavformat 57.83.100
// m=video 0 RTP/AVP 96
// b=AS:212
// a=rtpmap:96 H264/90000
// a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAIKzZQMApsBEAAAMAAQAAAwAyDxgxlg==,aOvssiw=; profile-level-id=640020
// a=control:streamid=0
// m=audio 0 RTP/AVP 97
// b=AS:30
// a=rtpmap:97 MPEG4-GENERIC/44100/2
// a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1210
// a=control:streamid=1
// - server.go:76
// INFO < R ANNOUNCE - server.go:89
// DEBUG requestLine=SETUP rtsp://localhost:5544/test110/streamid=0 RTSP/1.0, headers=map[CSeq:3 Transport:RTP/AVP/UDP;unicast;client_port=5560-5561;mode=record User-Agent:Lavf57.83.100] - server.go:60
// INFO < R SETUP - server.go:97
// DEBUG requestLine=SETUP rtsp://localhost:5544/test110/streamid=1 RTSP/1.0, headers=map[CSeq:4 Session:47112344 Transport:RTP/AVP/UDP;unicast;client_port=5562-5563;mode=record User-Agent:Lavf57.83.100] - server.go:60
// INFO < R SETUP - server.go:97
// DEBUG requestLine=RECORD rtsp://localhost:5544/test110 RTSP/1.0, headers=map[CSeq:5 Range:npt=0.000- Session:47112344 User-Agent:Lavf57.83.100] - server.go:60
// ERROR RECORD - server.go:105