diff --git a/writer/cmd/main.go b/writer/cmd/main.go index 079c5e0..3f20d6b 100644 --- a/writer/cmd/main.go +++ b/writer/cmd/main.go @@ -16,6 +16,7 @@ import ( "github.com/bluenviron/gortsplib/v4/pkg/format/rtph264" "github.com/gen2brain/aac-go" "github.com/pion/rtp" + "github.com/zaf/g711" ) var ( @@ -62,6 +63,7 @@ func main() { g711Format = media.Formats[0].(*format.G711) } } + if h264Format == nil || g711Format == nil { log.Fatalln("Форматы не найдены") } @@ -71,10 +73,6 @@ func main() { if err != nil { log.Fatalln("Ошибка создания декодера H264:", err) } - decoderG711, err := g711Format.CreateDecoder() - if err != nil { - log.Fatalln("Ошибка создания декодера G711:", err) - } // Обработка RTP-пакетов: для видео – запись NAL-ов с префиксом, для аудио – запись PCM-данных. client.OnPacketRTPAny(func(medi *description.Media, forma format.Format, pkt *rtp.Packet) { @@ -98,17 +96,26 @@ func main() { } } case *format.G711: - samples, err := decoderG711.Decode(pkt) - if err != nil { - log.Printf("Ошибка декодирования G711: %v", err) - return - } - fileMu.Lock() - defer fileMu.Unlock() - if currentAudioFile != nil { - if _, err := currentAudioFile.Write(samples); err != nil { - log.Printf("Ошибка записи аудио: %v", err) + if strings.Contains(forma.RTPMap(), "PCMA") { + sampleG711a := g711.DecodeAlaw(pkt.Payload) + defer fileMu.Lock() + defer fileMu.Unlock() + if currentAudioFile != nil { + if _, err := currentAudioFile.Write(sampleG711a); err != nil { + log.Printf("Ошибка записи аудио: %v", err) + } } + } else if strings.Contains(forma.RTPMap(), "PCMU") { + sampleG711u := g711.DecodeUlaw(pkt.Payload) + fileMu.Lock() + defer fileMu.Unlock() + if currentAudioFile != nil { + if _, err := currentAudioFile.Write(sampleG711u); err != nil { + log.Printf("Ошибка записи аудио: %v", err) + } + } + } else { + log.Println("Аудиокодек не идентифицирован") } } }) @@ -128,6 +135,7 @@ func main() { waitDuration := nextHour.Sub(now) fmt.Printf("Ожидание до начала записи: %v\n", waitDuration) time.Sleep(waitDuration) + log.Println("Начало записи фрагмента") // Создаем начальные файлы initialTimestamp := time.Now().Format("15-04_02-01-2006") diff --git a/writer/go.mod b/writer/go.mod index 4d6d991..6d25535 100644 --- a/writer/go.mod +++ b/writer/go.mod @@ -14,6 +14,7 @@ require ( github.com/pion/randutil v0.1.0 // indirect github.com/pion/rtcp v1.2.15 // indirect github.com/pion/sdp/v3 v3.0.10 // indirect + github.com/zaf/g711 v1.4.0 // indirect golang.org/x/net v0.34.0 // indirect golang.org/x/sys v0.29.0 // indirect ) diff --git a/writer/go.sum b/writer/go.sum index a34fbb0..8d1ecb3 100644 --- a/writer/go.sum +++ b/writer/go.sum @@ -26,6 +26,8 @@ github.com/youpy/go-wav v0.3.2 h1:NLM8L/7yZ0Bntadw/0h95OyUsen+DQIVf9gay+SUsMU= github.com/youpy/go-wav v0.3.2/go.mod h1:0FCieAXAeSdcxFfwLpRuEo0PFmAoc+8NU34h7TUvk50= github.com/zaf/g711 v0.0.0-20190814101024-76a4a538f52b h1:QqixIpc5WFIqTLxB3Hq8qs0qImAgBdq0p6rq2Qdl634= github.com/zaf/g711 v0.0.0-20190814101024-76a4a538f52b/go.mod h1:T2h1zV50R/q0CVYnsQOQ6L7P4a2ZxH47ixWcMXFGyx8= +github.com/zaf/g711 v1.4.0 h1:XZYkjjiAg9QTBnHqEg37m2I9q3IIDv5JRYXs2N8ma7c= +github.com/zaf/g711 v1.4.0/go.mod h1:eCDXt3dSp/kYYAoooba7ukD/Q75jvAaS4WOMr0l1Roo= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=