|
@@ -1,6 +1,7 @@
|
|
|
package controllers
|
|
|
|
|
|
import (
|
|
|
+ "encoding/binary"
|
|
|
"encoding/json"
|
|
|
"eta/eta_mini_crm_ht/models"
|
|
|
"eta/eta_mini_crm_ht/models/request"
|
|
@@ -11,6 +12,7 @@ import (
|
|
|
"fmt"
|
|
|
"github.com/rdlucklib/rdluck_tools/paging"
|
|
|
"github.com/tcolgate/mp3"
|
|
|
+ "mime/multipart"
|
|
|
"os"
|
|
|
"path"
|
|
|
"strconv"
|
|
@@ -63,12 +65,18 @@ func (this *AudioController) UploadAudio() {
|
|
|
br.ErrMsg = "音频上传失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
+ var duration int
|
|
|
+ if lowCaseExt == ".m4a" {
|
|
|
|
|
|
- //if lowcaseExt != ".mp3" {
|
|
|
- // br.Msg = "音频格式不正确"
|
|
|
- // br.ErrMsg = "音频上传失败,Err:" + err.Error()
|
|
|
- // return
|
|
|
- //}
|
|
|
+ }
|
|
|
+ if lowCaseExt == ".mp3" {
|
|
|
+ duration, err = mp3Duration(f)
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "音频上传失败"
|
|
|
+ br.ErrMsg = "解析音频时常失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
dateDir := time.Now().Format("20060102")
|
|
|
uploadDir := utils.STATIC_DIR + "ht/audio" + dateDir
|
|
|
err = os.MkdirAll(uploadDir, utils.DIR_MOD)
|
|
@@ -86,22 +94,6 @@ func (this *AudioController) UploadAudio() {
|
|
|
br.ErrMsg = "音频上传失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
- mp3File := mp3.NewDecoder(f)
|
|
|
- if err != nil {
|
|
|
- br.Msg = "音频上传失败"
|
|
|
- br.ErrMsg = "解析音频时常失败,Err:" + err.Error()
|
|
|
- return
|
|
|
- }
|
|
|
- var totalDuration time.Duration
|
|
|
- skipped := 0
|
|
|
- for {
|
|
|
- frame := mp3.Frame{}
|
|
|
- if err = mp3File.Decode(&frame, &skipped); err != nil {
|
|
|
- break
|
|
|
- }
|
|
|
- totalDuration += frame.Duration()
|
|
|
- }
|
|
|
- duration := int(totalDuration.Milliseconds())
|
|
|
|
|
|
audioUploadDir := utils.RESOURCE_DIR + "audio/"
|
|
|
savePdfToOssPath := audioUploadDir + time.Now().Format("200601/20060102/")
|
|
@@ -124,6 +116,7 @@ func (this *AudioController) UploadAudio() {
|
|
|
br.ErrMsg = "音频上传失败,Err:" + err.Error()
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
base := path.Base(h.Filename)
|
|
|
resp := new(response.MediaUploadResp)
|
|
|
resp.Url = mp3Url
|
|
@@ -134,6 +127,59 @@ func (this *AudioController) UploadAudio() {
|
|
|
br.Ret = 200
|
|
|
br.Success = true
|
|
|
}
|
|
|
+func mp3Duration(file multipart.File) (duration int, err error) {
|
|
|
+ mp3File := mp3.NewDecoder(file)
|
|
|
+
|
|
|
+ var totalDuration time.Duration
|
|
|
+ skipped := 0
|
|
|
+ for {
|
|
|
+ frame := mp3.Frame{}
|
|
|
+ if err = mp3File.Decode(&frame, &skipped); err != nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ totalDuration += frame.Duration()
|
|
|
+ }
|
|
|
+ duration = int(totalDuration.Milliseconds())
|
|
|
+ return
|
|
|
+}
|
|
|
+func m4aDuration(file multipart.File) (duration int, err error) {
|
|
|
+ var info = make([]byte, 0x10)
|
|
|
+ var boxHeader BoxHeader
|
|
|
+ var offset int64 = 0
|
|
|
+ // 获取moov结构偏移
|
|
|
+ for {
|
|
|
+ _, err = file.ReadAt(info, offset)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ boxHeader = getHeaderBoxInfo(info)
|
|
|
+ fourccType := getFourccType(boxHeader)
|
|
|
+ if fourccType == "moov" {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ // 有一部分mp4 mdat尺寸过大需要特殊处理
|
|
|
+ if fourccType == "mdat" {
|
|
|
+ if boxHeader.Size == 1 {
|
|
|
+ offset += int64(boxHeader.Size64)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ }
|
|
|
+ offset += int64(boxHeader.Size)
|
|
|
+ }
|
|
|
+ // 获取moov结构开头一部分
|
|
|
+ moovStartBytes := make([]byte, 0x100)
|
|
|
+ _, err = file.ReadAt(moovStartBytes, offset)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 定义timeScale与Duration偏移
|
|
|
+ timeScaleOffset := 0x1C
|
|
|
+ durationOffest := 0x20
|
|
|
+ timeScale := binary.BigEndian.Uint32(moovStartBytes[timeScaleOffset : timeScaleOffset+4])
|
|
|
+ Duration := binary.BigEndian.Uint32(moovStartBytes[durationOffest : durationOffest+4])
|
|
|
+ duration = int(Duration * 1000 / timeScale)
|
|
|
+ return
|
|
|
+}
|
|
|
|
|
|
// AddAudio @Title 新增音频
|
|
|
// @Description 新增音频
|
|
@@ -175,14 +221,13 @@ func (this *AudioController) AddAudio() {
|
|
|
return
|
|
|
}
|
|
|
var err error
|
|
|
-
|
|
|
audioInsert := &models.Media{
|
|
|
AuthorId: req.AnalystId,
|
|
|
AuthorName: req.AnalystName,
|
|
|
MediaType: models.Audio,
|
|
|
Src: req.SrcUrl,
|
|
|
MediaName: req.AudioName,
|
|
|
- SourceType: "mp3",
|
|
|
+ SourceType: req.SrcUrl[strings.LastIndex(req.SrcUrl, ".")+1:],
|
|
|
MediaPlayMilliseconds: req.DurationMillisecond,
|
|
|
PermissionIds: req.PermissionIds,
|
|
|
SendStatus: models.UNSEND,
|