请使用golang实现timeSleepframeDurationtimeMicrosecond - sTime内的计算时间单位是正确的修复代码: averageDuration = float64duration 1000 float64lenframes 平均每帧的时长毫秒 frameDuration = timeDurationaverageDuration 1000 timeSle
修复代码如下:
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)来确保每帧的播放时长符合要求
原文地址: http://www.cveoy.top/t/topic/ikuw 著作权归作者所有。请勿转载和采集!