3

我正在开发一个项目,该项目将数据存储在音轨上,并且需要对音频轨道的起点和终点使用时间码。我还需要计算并显示曲目的持续时间。例如。曲目从 0:01:30 开始,到 0:04:12 结束。所以它的持续时间总共是 2 分 42 秒。

诀窍是所有内容都需要作为时间码显示和处理,因此在上面的示例中,持续时间需要显示为 0:02:42。

所以我的问题是你将如何存储这些值?最简单的选择是将开始和结束时间作为时间存储在数据库中。计算持续时间非常容易,您可以在表单中使用 Rails 时间助手。唯一痛苦的部分是将持续时间转换回显示的时间值(因为如果我只提供秒数,strptime它会继续使用当前时间来填写其他字段)

我考虑的另一个选项是将它们存储为数值(作为秒数)。但是我必须编写大量代码来将它们转换为某种类型的时间码格式,并且我不能使用 Rails 时间助手。

还有其他我没有考虑过的想法吗?有没有一种简单的方法可以计算持续时间并将其显示为时间码格式?

4

1 回答 1

4

我会将它们存储为秒或毫秒。我一直在用 Ruby 开发音乐库管理器/音频播放器,实际上我必须编写您需要的两种方法。代码不多:

  # Helper method to format a number of milliseconds as a string like
  # "1:03:56.555". The only option is :include_milliseconds, true by default. If
  # false, milliseconds won't be included in the formatted string.
  def format_time(milliseconds, options = {})
    ms = milliseconds % 1000
    seconds = (milliseconds / 1000) % 60
    minutes = (milliseconds / 60000) % 60
    hours = milliseconds / 3600000

    if ms.zero? || options[:include_milliseconds] == false
      ms_string = ""
    else
      ms_string = ".%03d" % [ms]
    end

    if hours > 0
      "%d:%02d:%02d%s" % [hours, minutes, seconds, ms_string]
    else
      "%d:%02d%s" % [minutes, seconds, ms_string]
    end
  end

  # Helper method to parse a string like "1:03:56.555" and return the number of
  # milliseconds that time length represents.
  def parse_time(string)
    parts = string.split(":").map(&:to_f)
    parts = [0] + parts if parts.length == 2
    hours, minutes, seconds = parts
    seconds = hours * 3600 + minutes * 60 + seconds
    milliseconds = seconds * 1000
    milliseconds.to_i
  end

它以毫秒为单位编写,如果将其更改为以秒为单位,则会简单得多。

于 2012-12-19T23:09:19.890 回答