Prechádzať zdrojové kódy

修改内存泄漏问题

dxc 1 rok pred
rodič
commit
935d7e0f32
3 zmenil súbory, kde vykonal 36 pridanie a 53 odobranie
  1. 2 3
      go.mod
  2. 13 27
      job/job.go
  3. 21 23
      pkg/oss/qiniu.go

+ 2 - 3
go.mod

@@ -3,6 +3,8 @@ module audio_transcoder
 go 1.20
 
 require (
+	github.com/boltdb/bolt v1.3.1
+	github.com/gabriel-vasile/mimetype v1.4.4
 	github.com/google/uuid v1.6.0
 	github.com/qiniu/go-sdk/v7 v7.20.1
 	github.com/zeromicro/go-zero v1.6.5
@@ -10,12 +12,9 @@ require (
 
 require (
 	github.com/beorn7/perks v1.0.1 // indirect
-	github.com/boltdb/bolt v1.3.1 // indirect
-	github.com/boltdb/boltd v0.0.0-20150220181201-1f04e2021e45 // indirect
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/fatih/color v1.16.0 // indirect
-	github.com/gabriel-vasile/mimetype v1.4.4 // indirect
 	github.com/go-logr/logr v1.3.0 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/gofrs/flock v0.8.1 // indirect

+ 13 - 27
job/job.go

@@ -6,6 +6,7 @@ import (
 	"bytes"
 	"encoding/json"
 	"errors"
+	"fmt"
 	"github.com/google/uuid"
 	"github.com/zeromicro/go-zero/core/logx"
 	"io"
@@ -74,6 +75,7 @@ func AutoTranscoder(ctx *svc.ServiceContext) {
 
 // Transcoder 转码
 func Transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *types.OriginDataResponse, err error) {
+	fmt.Println("转码中...")
 	if req.Path == "" {
 		err = StopTranscoderError
 		return
@@ -85,26 +87,26 @@ func Transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *t
 	// 发起HTTP GET请求
 	resp1, err := http.Get(req.Path)
 	if err != nil {
-		logx.Errorf("下载文件失败 error:", err.Error())
+		logx.Errorf("下载文件失败 error:%s", err.Error())
 		return
 	}
 	defer resp1.Body.Close()
 	if resp1.StatusCode != http.StatusOK {
 		err = errors.New("download file failed")
-		logx.Errorf("下载文件失败 error:", resp1.StatusCode)
+		logx.Errorf("下载文件失败 error:%v", resp1.StatusCode)
 		return
 	}
 	// 读取响应体内容
 	inputPath := uuid.NewString() // 本地保存的文件路径
 	inputFile, err := os.Create(inputPath)
 	if err != nil {
-		logx.Errorf("读取文件失败 error:", err.Error())
+		logx.Errorf("读取文件失败 error:%s", err.Error())
 		return
 	}
 	_, err = io.Copy(inputFile, resp1.Body)
 	inputFile.Close()
 	if err != nil {
-		logx.Errorf("读取文件失败 error:", err.Error())
+		logx.Errorf("读取文件失败 error:%s", err.Error())
 		return
 	}
 	//判断文件类型,如果不是指定语音则返回
@@ -135,24 +137,8 @@ func Transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *t
 	} else if inputType == 2 {
 		wavPath, pcmPath = silk.TransMp3ToWav(inputPath)
 	}
-	wavFile, err := os.Open(wavPath)
-	if err != nil {
-		logx.Errorf("读取wav文件失败 error:", err.Error())
-		return
-	}
-	defer func() {
-		wavFile.Close()
-		silk.FileRemove(wavPath)
-	}()
-	pcmFile, err := os.Open(pcmPath)
-	if err != nil {
-		logx.Errorf("读取pcm文件失败 error:", err.Error())
-		return
-	}
-	defer func() {
-		pcmFile.Close()
-		silk.FileRemove(pcmPath)
-	}()
+	defer silk.FileRemove(wavPath)
+	defer silk.FileRemove(pcmPath)
 	//多线程处理上传录音和语音识别
 	var wg sync.WaitGroup
 	wg.Add(2)
@@ -161,10 +147,9 @@ func Transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *t
 	//上传录音
 	go func() {
 		defer wg.Done()
-		bts, _ := io.ReadAll(wavFile)
-		url, err := svcCtx.QiNiuSdk.Upload(bts, int64(len(bts)), wavPath)
+		url, err := svcCtx.QiNiuSdk.Upload(wavPath, wavPath)
 		if err != nil {
-			logx.Errorf("上传七牛云失败 error:", err.Error())
+			logx.Errorf("上传七牛云失败 error:%s", err.Error())
 			return
 		}
 		err1 = err
@@ -173,10 +158,10 @@ func Transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *t
 	//识别录音
 	go func() {
 		defer wg.Done()
-		bts, _ := io.ReadAll(pcmFile)
+		bts, _ := os.ReadFile(pcmPath)
 		asrResp, err := svcCtx.AsrSdk.Asr(bts, "pcm", 16000)
 		if err != nil {
-			logx.Errorf("语音识别失败 error:", err.Error())
+			logx.Errorf("语音识别失败 error:%s", err.Error())
 			return
 		}
 		err2 = err
@@ -190,5 +175,6 @@ func Transcoder(svcCtx *svc.ServiceContext, req *types.CallbackRequest) (resp *t
 	if err2 != nil {
 		return nil, err2
 	}
+	fmt.Println("已转码...")
 	return
 }

+ 21 - 23
pkg/oss/qiniu.go

@@ -1,47 +1,45 @@
 package oss
 
 import (
-	"bytes"
 	"context"
 	"github.com/qiniu/go-sdk/v7/auth/qbox"
 	"github.com/qiniu/go-sdk/v7/storage"
 )
 
 type QiNiuSdk struct {
-	accessKey string
-	secretKey string
-	bucket    string
-	hostUrl   string
+	accessKey    string
+	secretKey    string
+	bucket       string
+	hostUrl      string
+	formUploader *storage.FormUploader
 }
 
 func NewQiNiuSdk(AccessKey, SecretKey, Bucket, HostUrl string) *QiNiuSdk {
+	cfg := storage.Config{}
+	// 空间对应的机房
+	cfg.Zone = &storage.ZoneHuabei
+	cfg.UseHTTPS = false
+	cfg.UseCdnDomains = false
 	return &QiNiuSdk{
-		accessKey: AccessKey,
-		secretKey: SecretKey,
-		bucket:    Bucket,
-		hostUrl:   HostUrl,
+		accessKey:    AccessKey,
+		secretKey:    SecretKey,
+		bucket:       Bucket,
+		hostUrl:      HostUrl,
+		formUploader: storage.NewFormUploader(&cfg),
 	}
 }
 
-func (s *QiNiuSdk) Upload(data []byte, dataLen int64, filename string) (url string, err error) {
+func (s *QiNiuSdk) Upload(filePath string, filename string) (url string, err error) {
 	var (
 		putPolicy = storage.PutPolicy{
 			Scope: s.bucket,
 		}
-		mac     = qbox.NewMac(s.accessKey, s.secretKey)
-		upToken = putPolicy.UploadToken(mac)
-		cfg     = storage.Config{}
-	)
-	// 空间对应的机房
-	cfg.Zone = &storage.ZoneHuabei
-	cfg.UseHTTPS = false
-	cfg.UseCdnDomains = false
-	var (
-		formUploader = storage.NewFormUploader(&cfg)
-		ret          = storage.PutRet{}
-		putExtra     = storage.PutExtra{}
+		mac      = qbox.NewMac(s.accessKey, s.secretKey)
+		upToken  = putPolicy.UploadToken(mac)
+		ret      = storage.PutRet{}
+		putExtra = storage.PutExtra{}
 	)
-	if err = formUploader.Put(context.Background(), &ret, upToken, filename, bytes.NewReader(data), dataLen, &putExtra); err == nil {
+	if err = s.formUploader.PutFile(context.Background(), &ret, upToken, filename, filePath, &putExtra); err == nil {
 		url = s.hostUrl + "/" + ret.Key
 	}
 	return