修复代码如下:

averageDuration := float64(duration) * 1000 / float64(len(frames)) // 平均每帧的时长(毫秒)
frameDuration := time.Duration(averageDuration * 1000 * 1000) // 将平均每帧的时长转换为纳秒
//time.Sleep(frameDuration * time.Microsecond)
//logs.Info("totalFrames: %d, frameDuration,%v,%v,%v", len(frames), time.Duration(averageDuration), frameDuration, frameDuration*time.Microsecond)
start_time := time.Now()
var sumTime = time.Duration(0)
var sTime time.Duration
Loop:
for i := 0; i < len(frames); i++ {
    frame := make([]float32, 61)
    s_time := time.Now()
    for j := 0; j < 51; j++ {
        //if j == 1 || j == 4 || j == 11 || j == 8 || j == 9 || j == 10 {
        //	if frames[i][j] != 0 {
        //		frames[i][j] = 0
        //	}
        //}
        frame[j] = float32(frames[i][j]) / coefl
    }
    select {
    case <-sig:
        logs.Info("%s, recv quit sig, quit now", commonInfo)
        finish = false
        break Loop
    default:
        data := MakeBSFrame(frame)
        var nsent = 0
        for nsent < len(data) {
            n, err := socket.Write(data[nsent:])
            if err != nil {
                fmt.Println("send, err =", err)
            }
            nsent += n
        }
        //time.Sleep(16*time.Millisecond + 176*time.Microsecond)
        sTime = time.Since(s_time)
        time.Sleep(frameDuration - sTime)
        sumTime = sumTime + frameDuration
        logs.Info("sTime: %v, frameDuration: %v, frameDuration - sTime: %v", sTime, frameDuration, frameDuration-sTime)
    }
}

修复后的代码将frameDuration的单位转换为纳秒,并使用time.Sleep(frameDuration - sTime)来确保每帧的播放时长符合要求

请使用golang实现timeSleepframeDurationtimeMicrosecond - sTime内的计算时间单位是正确的修复代码:	averageDuration = float64duration 1000 float64lenframes 平均每帧的时长毫秒	frameDuration = timeDurationaverageDuration 1000	timeSle

原文地址: http://www.cveoy.top/t/topic/ikuw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录