From 7891a6ed4cc1045dfb7b7e2ddad807c0f74ce96e Mon Sep 17 00:00:00 2001 From: fumiama Date: Sun, 7 Aug 2022 16:40:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96cut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api_test.go | 2 +- ogg.go | 58 ++++++++++++++++++++++++++++++++-------------------- test.wav | Bin 416612 -> 396132 bytes 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/api_test.go b/api_test.go index 287e581..f19e839 100644 --- a/api_test.go +++ b/api_test.go @@ -17,7 +17,7 @@ func TestAPI(t *testing.T) { if err != nil { t.Fatal(err) } - err = SaveOggToWav(u, "test.wav") + err = SaveOggToFile(u, "test.wav") if err != nil { t.Fatal(err) } diff --git a/ogg.go b/ogg.go index c48f4fa..cc10cf3 100644 --- a/ogg.go +++ b/ogg.go @@ -1,6 +1,7 @@ package ahsai import ( + "io" "net/http" "os" "time" @@ -11,7 +12,25 @@ import ( "github.com/faiface/beep/wav" ) -func SaveOggToWav(u, path string) error { +func cutstream(s beep.StreamSeekCloser) { + tmp := make([][2]float64, 1024) + c := 0 + for c < 6 { + _, _ = s.Stream(tmp) + sum := (tmp[0][0] + tmp[0][1]) / 2 + for j := 1; j < 1024; j++ { + sum += (tmp[j][0] + tmp[j][1]) / 2 + sum /= 2 + } + if sum < 1e-32 && sum > -1e-32 { + c++ + } else { + c = 0 + } + } +} + +func SaveOggToFile(u, path string) error { resp, err := http.Get(u) if err != nil { return err @@ -27,17 +46,22 @@ func SaveOggToWav(u, path string) error { return err } defer f.Close() - tmp := make([][2]float64, 1024) - _, _ = s.Stream(tmp) - sum := (tmp[0][0] + tmp[0][1]) / 2 - for sum > 1e-32 || sum < -1e-32 { - _, _ = s.Stream(tmp) - sum = (tmp[0][0] + tmp[0][1]) / 2 - for j := 1; j < 1024; j++ { - sum += (tmp[j][0] + tmp[j][1]) / 2 - sum /= 2 - } + cutstream(s) + return wav.Encode(f, s, format) +} + +func SaveOggToWriteSeeker(u string, f io.WriteSeeker) error { + resp, err := http.Get(u) + if err != nil { + return err } + s, format, err := vorbis.Decode(resp.Body) + if err != nil { + resp.Body.Close() + return err + } + defer s.Close() + cutstream(s) return wav.Encode(f, s, format) } @@ -52,17 +76,7 @@ func PlayOgg(u string) error { return err } defer s.Close() - tmp := make([][2]float64, 1024) - _, _ = s.Stream(tmp) - sum := (tmp[0][0] + tmp[0][1]) / 2 - for sum > 1e-32 || sum < -1e-32 { - _, _ = s.Stream(tmp) - sum = (tmp[0][0] + tmp[0][1]) / 2 - for j := 1; j < 1024; j++ { - sum += (tmp[j][0] + tmp[j][1]) / 2 - sum /= 2 - } - } + cutstream(s) err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/32)) if err != nil { return err diff --git a/test.wav b/test.wav index 5cb6d8d5ee9a4938a3369a930393590c7ec3e59d..e7c8ca8a030abe208856796027a8180a0f270a90 100644 GIT binary patch delta 63 zcmaE|P4dY!3AP|lH@6h-iEPSD+-!}8TMZc*7f(;%W#O29fPlrvF*W!qM)q Um=TDXfS4JGS++YYW>v`m09OYX!2kdN