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 } } } }