3

オーディオ トラックにデータを保存するプロジェクトに取り組んでおり、オーディオ上のトラックの開始点と終了点にタイムコードを使用する必要があります。また、トラックの長さを計算して表示する必要があります。例えば。トラックは 0:01:30 に開始し、0:04:12 に終了します。したがって、その持続時間は合計 2 分 42 秒です。

秘訣は、すべてをタイムコードとして表示および処理する必要があるため、上記の例ではデュレーションを 0:02:42 として表示する必要があることです。

だから私の質問は、値をどのように保存するのですか? 最も簡単な方法は、開始時刻と終了時刻を Time としてデータベースに保存することです。期間の計算は非常に簡単で、フォームで Rails の時間ヘルパーを利用できます。唯一の苦痛な部分は、表示のために期間を時間値に戻すことです(秒数だけを指定するstrptimeと、現在の時間を使用して他のフィールドに入力し続けるため)

私が検討したもう1つのオプションは、それらを数値として(秒数として)保存することです。しかし、タイムコード形式との間で変換するために大量のコードを書かなければならず、Rails の時間ヘルパーを使用することはできません。

私が考慮していない別のアイデアはありますか?デュレーションをタイムコード形式で計算して表示する簡単な方法はありますか?

4

1 に答える 1

4

それらを秒またはミリ秒として保存します。私は Ruby で音楽ライブラリ マネージャー/オーディオ プレーヤーに取り組んできましたが、実際に必要な 2 つのメソッドを作成する必要がありました。それはそれほど多くのコードではありません:

  # 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 に答える