vdk/example/transcoder/main.go

72 lines
2.1 KiB
Go
Raw Permalink Normal View History

2023-03-23 02:59:06 +08:00
package main
import (
"context"
"encoding/binary"
"git.r-2.top/kunmeng/vdk/format/rtspv2"
"git.r-2.top/kunmeng/vdk/format/ts"
2023-03-23 02:59:06 +08:00
"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})
2023-03-23 02:59:06 +08:00
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)
//}
2023-03-23 02:59:06 +08:00
for {
demuxer.ReadPacket()
//pkt, err := demuxer.ReadPacket()
//if err != nil {
// log.Panic(err)
//}
//log.Println("im new pkt ===>", pkt.Idx, pkt.Time)
2023-03-23 02:59:06 +08:00
}
}()
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]))
2023-03-23 02:59:06 +08:00
if packetAV.IsKeyFrame {
start = true
}
if !start {
continue
}
if err = mux.WritePacket(*packetAV); err != nil {
return
}
}
}
}