56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package ffser
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"math"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"91porn-server/common/crypt"
|
|
)
|
|
|
|
// AvFormat 调用ffmpeg 获取信息
|
|
func AvFormat(fpath string) (resloution string, playTime uint, err error) {
|
|
args := makeArgs(fpath, []string{"width", "height", "duration"}...)
|
|
fmt.Printf("%v", args)
|
|
command := exec.CommandContext(context.Background(), "ffprobe", args...)
|
|
out, err := command.CombinedOutput()
|
|
if err != nil {
|
|
fmt.Printf("ffprobe convert to ts wrong %+v", err)
|
|
return
|
|
}
|
|
if strings.Contains(string(out), "Invalid argument") {
|
|
err = errors.New("ffmpeg convert err")
|
|
return
|
|
}
|
|
result, _ := crypt.JSON2Map(string(out))
|
|
if v, ok := result["streams"].([]interface{}); ok {
|
|
if v2, ok := v[0].(map[string]interface{}); ok {
|
|
width, _ := json.Marshal(v2["width"])
|
|
height, _ := json.Marshal(v2["height"])
|
|
duration, _ := v2["duration"].(string)
|
|
resloution = string(width) + "*" + string(height)
|
|
pt, _ := strconv.ParseFloat(string(duration), 32)
|
|
playTime = uint(math.Ceil(pt))
|
|
fmt.Println(playTime)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func makeArgs(path string, command ...string) []string {
|
|
com := strings.Join(command, ",")
|
|
return []string{
|
|
"-v", "quiet",
|
|
"-v", "quiet",
|
|
"-select_streams", "v", "-show_entries",
|
|
"stream=" + com,
|
|
"-i", path,
|
|
}
|
|
}
|