mirror of
				https://github.com/AlexxIT/go2rtc.git
				synced 2025-10-31 11:46:26 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package camera
 | |
| 
 | |
| import (
 | |
| 	cryptorand "crypto/rand"
 | |
| 	"encoding/binary"
 | |
| 	"github.com/brutella/hap/rtp"
 | |
| )
 | |
| 
 | |
| type Session struct {
 | |
| 	Offer  *rtp.SetupEndpoints
 | |
| 	Answer *rtp.SetupEndpointsResponse
 | |
| 	Config *rtp.StreamConfiguration
 | |
| }
 | |
| 
 | |
| func NewSession(vp *rtp.VideoParameters, ap *rtp.AudioParameters) *Session {
 | |
| 	vp.RTP = rtp.RTPParams{
 | |
| 		PayloadType: 99,
 | |
| 		Ssrc:        RandomUint32(),
 | |
| 		Bitrate:     2048,
 | |
| 		Interval:    10,
 | |
| 		MTU:         1200, // like WebRTC
 | |
| 	}
 | |
| 	ap.RTP = rtp.RTPParams{
 | |
| 		PayloadType:             110,
 | |
| 		Ssrc:                    RandomUint32(),
 | |
| 		Bitrate:                 32,
 | |
| 		Interval:                10,
 | |
| 		ComfortNoisePayloadType: 98,
 | |
| 		MTU:                     0,
 | |
| 	}
 | |
| 
 | |
| 	sessionID := RandomBytes(16)
 | |
| 	s := &Session{
 | |
| 		Offer: &rtp.SetupEndpoints{
 | |
| 			SessionId: sessionID,
 | |
| 			Video: rtp.CryptoSuite{
 | |
| 				MasterKey:  RandomBytes(16),
 | |
| 				MasterSalt: RandomBytes(14),
 | |
| 			},
 | |
| 			Audio: rtp.CryptoSuite{
 | |
| 				MasterKey:  RandomBytes(16),
 | |
| 				MasterSalt: RandomBytes(14),
 | |
| 			},
 | |
| 		},
 | |
| 		Config: &rtp.StreamConfiguration{
 | |
| 			Command: rtp.SessionControlCommand{
 | |
| 				Identifier: sessionID,
 | |
| 				Type:       rtp.SessionControlCommandTypeStart,
 | |
| 			},
 | |
| 			Video: *vp,
 | |
| 			Audio: *ap,
 | |
| 		},
 | |
| 	}
 | |
| 	return s
 | |
| }
 | |
| 
 | |
| func (s *Session) SetLocalEndpoint(host string, port uint16) {
 | |
| 	s.Offer.ControllerAddr = rtp.Addr{
 | |
| 		IPAddr:       host,
 | |
| 		VideoRtpPort: port,
 | |
| 		AudioRtpPort: port,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func RandomBytes(size int) []byte {
 | |
| 	data := make([]byte, size)
 | |
| 	_, _ = cryptorand.Read(data)
 | |
| 	return data
 | |
| }
 | |
| 
 | |
| func RandomUint32() uint32 {
 | |
| 	data := make([]byte, 4)
 | |
| 	_, _ = cryptorand.Read(data)
 | |
| 	return binary.BigEndian.Uint32(data)
 | |
| }
 | 
