Преобразование миллисекунд в таймкод - PullRequest
1 голос
/ 11 марта 2010

У меня есть аудиопроект, над которым я работаю, используя BASS из Un4seen. Эта библиотека в основном использует BYTES, но у меня есть преобразование, которое позволяет мне показывать текущую позицию песни в миллисекундах.

Зная, что MS = Samples * 1000 / SampleRate и что Samples = Bytes * 8 / Bits / Channels

Итак, вот моя главная проблема, и она довольно проста ... У меня есть функция в моем проекте, которая преобразует миллисекунды в TimeCode за минуты: секунды: миллисекунды.

Public Function ConvertMStoTimeCode(ByVal lngCurrentMSTimeValue As Long)
        ConvertMStoTimeCode = CheckForLeadingZero(Fix(lngCurrentMSTimeValue / 1000 / 60)) & ":" & _
        CheckForLeadingZero(Int((lngCurrentMSTimeValue / 1000) Mod 60)) & ":" & _
        CheckForLeadingZero(Int((lngCurrentMSTimeValue / 10) Mod 100))
End Function

Теперь проблема входит в подсчет секунд. Каждый раз, когда вычисление MS заканчивается .5 секунды округляется до следующей секунды. Таким образом, 1,5 секунды фактически печатаются как 2,5 секунды. Я точно знаю, что использование конверсии Int вызывает округление вниз, и я знаю, что моя математика верна, поскольку я проверял калькулятор 100 раз. Я не могу понять, почему число округляется. Есть предложения?

Ответы [ 3 ]

1 голос
/ 11 марта 2010

В вашей логике преобразования секунд есть недостаток. Например, предположим, что вы хотите конвертировать 1500 мс. Ваш код для подсчета секунд:

Int((lngCurrentMSTimeValue / 1000) Mod 60)

Вернет 2. 1500 мс не более двух секунд! Для вычисления секунд выполните целочисленное деление (оператор "\") миллисекунд на 1000:

(lngCurrentMSTimeValue \ 1000) Mod 60

Возвращает 1, как и ожидалось. Следующая функция - это все, что вам нужно. Он даже устраняет необходимость в вашей функции CheckForLeadingZero с помощью встроенной функции Format:

Public Function ConvertMStoTimeCode(ByVal lngCurrentMSTimeValue As Long)

  Dim minutes As Long
  Dim seconds As Long
  Dim milliseconds As Long

  minutes = (lngCurrentMSTimeValue / 1000) \ 60
  seconds = (lngCurrentMSTimeValue \ 1000) Mod 60
  milliseconds = lngCurrentMSTimeValue Mod 1000

  ConvertMStoTimeCode = Format(minutes, "00") & ":" & Format(seconds, "00") & _
    ":" & Format(milliseconds, "000")

End Function
0 голосов
/ 18 августа 2011

Вот эквивалент обработки / Java, который довольно просто переназначить.

String timecodeString(int fps) {
  float ms = millis();
  return String.format("%02d:%02d:%02d+%02d", floor(ms/1000/60/60),    // H
                                              floor(ms/1000/60),       // M
                                              floor(ms/1000%60),       // S
                                              floor(ms/1000*fps%fps)); // F
}
0 голосов
/ 11 марта 2010

Пока это работает:

Public Function ConvertMStoTimeCode(ByVal lngCurrentMSTimeValue As Long)
Dim strMinute As String
Dim strSecond As String
Dim strFrames As String

strMinute = CheckForLeadingZero(Fix(lngCurrentMSTimeValue / 1000 / 60))
strSecond = CheckForLeadingZero(Int((lngCurrentMSTimeValue / 1000) Mod 60))
strFrames = CheckForLeadingZero(Int((lngCurrentMSTimeValue / 10) Mod 100))

If (strFrames > 49) Then
    strSecond = CheckForLeadingZero(Int((lngCurrentMSTimeValue / 1000) Mod 60) - 1)
End If

ConvertMStoTimeCode = strMinute & ":" & strSecond & ":" & strFrames

Функция завершения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...