package audio import ( "bytes" "io" "log" "net/http" "net/url" "os" "strings" ) type reader struct { bytes.Reader io.Closer } func (a *reader) Seek(offset int64, whence int) (int64, error) { return a.Reader.Seek(offset, whence) } func toSeeker(src io.ReadCloser) io.ReadCloser { buf := &bytes.Buffer{} _, _ = io.Copy(buf, src) return &reader{ Reader: *bytes.NewReader(buf.Bytes()), Closer: src, } } func open(u string) io.ReadCloser { p, _ := strings.CutPrefix(u, "file://") f, e := os.Open(p) if e != nil { log.Printf("音频文件 [%v] 打开错误: %v\n", u, e) return nil } return f } func get(u string) io.ReadCloser { resp, e := http.Get(u) if e != nil { log.Printf("音频文件 [%v] 下载失败: %v\n", u, e) return nil } return resp.Body } func LinkAudio(link string) (bgm io.ReadCloser) { u, err := url.Parse(link) if err != nil { log.Println("音频 URL 解析错误: ", err) } else { if u.Scheme == "file" { bgm = open(u.String()) } else if u.Scheme == "http" || u.Scheme == "https" { bgm = get(u.String()) } else { log.Printf("不支持的音频文件协议: %v\n", u.String()) return } bgm = toSeeker(bgm) } return }