1

我是 Ruby 的新手,所以我可能会完全错误地解决这个问题,但是使用taglib-ruby我一直得到错误的结果,除非它是错误的秒数,也许是纳秒?

我尝试了bash和 mediainfo 不同的电影,但效果还不错...

$(date -ud "@$(($seconds/1000))" +'%_H:%M')
def get_duration_hrs_and_mins(milliseconds)
    return '' unless milliseconds

    hours, milliseconds   = milliseconds.divmod(1000 * 60 * 60)
    minutes, milliseconds = milliseconds.divmod(1000 * 60)
    seconds, milliseconds = milliseconds.divmod(1000)
    "#{hours}h #{minutes}m #{seconds}s #{milliseconds}ms"
end

TagLib::MP4::File.open("filename.mp4") do |mp4|
    seconds = mp4.length
    puts get_duration_hrs_and_mins(seconds)
end

秒数为 1932993085,持续时间应约为 2 小时 15 分钟。

4

1 回答 1

0

恐怕你被误导了。对象的length属性是从常规类TagLib::MP4::File继承的,只是告诉你文件的大小(以字节为单位);File它与包含媒体的持续时间无关:

$ ls -l test.mp4
-rw-r--r--@ 1 user  staff  39001360 Aug 14  2015 test.mp4
$ ruby -rtaglib -e 'TagLib::MP4::File.open("test.mp4"){|f|puts f.length}'
39001360

我在上面的代码片段中检查的特定文件恰好有 25 秒长,但从大约 39 兆字节的大小来看,无法判断这一点。

你想要的是对象的#length方法TagLib::MP4::Properties,而不是对象的方法::File。您可以通过调用#audio_propertiesFile 对象来获得它:

TagLib::MP4::File.open("filename.mp4") do |mp4|
  seconds = mp4.audio_properties.length
  puts get_duration_hrs_and_mins(seconds)
end

该返回值是秒,而不是毫秒,因此您需要get_duration相应地调整您的方法。真的你只想要这样的东西:

total_seconds = mp4.audio_properties.length
total_minutes, seconds = total_seconds.divmod(60)
total_hours, minutes = total_minutes.divmod(60)
days, hours = total_hours.divmod(24)

puts "Duration is #{days}d#{hours}h#{minutes}m#{seconds}s"
于 2019-09-04T02:44:32.603 回答