72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"encoding/binary"
 | |
| 	"git.r-2.top/kunmeng/vdk/format/rtspv2"
 | |
| 	"git.r-2.top/kunmeng/vdk/format/ts"
 | |
| 	"log"
 | |
| 	"os/exec"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	RTSPClient, err := rtspv2.Dial(rtspv2.RTSPClientOptions{URL: "rtsp://192.168.211.210:8554", DisableAudio: true, DialTimeout: 3 * time.Second, ReadWriteTimeout: 5 * time.Second, Debug: false, OutgoingProxy: false})
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	ctx, cancel := context.WithCancel(context.Background())
 | |
| 	defer cancel()
 | |
| 	cmd := exec.CommandContext(ctx, "ffmpeg", "-flags", "low_delay", "-analyzeduration", "1", "-fflags", "-nobuffer", "-probesize", "1024k", "-f", "mpegts", "-i", "-", "-vcodec", "libx264", "-preset", "ultrafast", "-bf", "0", "-f", "mpegts", "-max_muxing_queue_size", "400", "-pes_payload_size", "0", "pipe:1")
 | |
| 	inPipe, _ := cmd.StdinPipe()
 | |
| 	outPipe, _ := cmd.StdoutPipe()
 | |
| 	//cmd.Stderr = os.Stderr
 | |
| 	mux := ts.NewMuxer(inPipe)
 | |
| 	demuxer := ts.NewDemuxer(outPipe)
 | |
| 	codec := RTSPClient.CodecData
 | |
| 	mux.WriteHeader(codec)
 | |
| 	go func() {
 | |
| 		imNewCodec, err := demuxer.Streams()
 | |
| 		log.Println("new codec data", imNewCodec, err)
 | |
| 		//for i, data := range imNewCodec {
 | |
| 		//	log.Println(i, data)
 | |
| 		//}
 | |
| 		for {
 | |
| 			demuxer.ReadPacket()
 | |
| 			//pkt, err := demuxer.ReadPacket()
 | |
| 			//if err != nil {
 | |
| 			//	log.Panic(err)
 | |
| 			//}
 | |
| 			//log.Println("im new pkt ===>", pkt.Idx, pkt.Time)
 | |
| 		}
 | |
| 	}()
 | |
| 	cmd.Start()
 | |
| 	var start bool
 | |
| 	for {
 | |
| 		select {
 | |
| 		case signals := <-RTSPClient.Signals:
 | |
| 			switch signals {
 | |
| 			case rtspv2.SignalCodecUpdate:
 | |
| 				//?
 | |
| 			case rtspv2.SignalStreamRTPStop:
 | |
| 				return
 | |
| 			}
 | |
| 		case packetAV := <-RTSPClient.OutgoingPacketQueue:
 | |
| 			//log.Println(packetAV.Extensions)
 | |
| 			t := time.UnixMilli(int64(binary.LittleEndian.Uint32(packetAV.Extensions[20:24]))*1000 + int64(binary.LittleEndian.Uint32(packetAV.Extensions[24:28]))/1000)
 | |
| 			log.Println(t.Format("2006-01-02 15:04:05.000"))
 | |
| 			//println(binary.LittleEndian.Uint32(packetAV.Extensions[24:28]))
 | |
| 			//println(binary.LittleEndian.Uint32(packetAV.Extensions[20:24]))
 | |
| 			if packetAV.IsKeyFrame {
 | |
| 				start = true
 | |
| 			}
 | |
| 			if !start {
 | |
| 				continue
 | |
| 			}
 | |
| 			if err = mux.WritePacket(*packetAV); err != nil {
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | 
