将假定的秒数转换为持续时间?
Convert supposed seconds to duration?
我是 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 分钟。
恐怕你误会了。 TagLib::MP4::File
object is inherited from the regular File
class 的 length
属性只告诉您文件的大小(以字节为单位);它与包含媒体的持续时间无关:
$ 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
method of the TagLib::MP4::Properties
对象,而不是 ::File
对象。您可以通过在 File 对象上调用 #audio_properties
来获取它:
TagLib::MP4::File.open("filename.mp4") do |mp4|
seconds = mp4.audio_properties.length
puts get_duration_hrs_and_mins(seconds)
end
return 值是秒,而不是毫秒,因此您需要相应地调整您的 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"
我是 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 分钟。
恐怕你误会了。 TagLib::MP4::File
object is inherited from the regular File
class 的 length
属性只告诉您文件的大小(以字节为单位);它与包含媒体的持续时间无关:
$ 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
method of the TagLib::MP4::Properties
对象,而不是 ::File
对象。您可以通过在 File 对象上调用 #audio_properties
来获取它:
TagLib::MP4::File.open("filename.mp4") do |mp4|
seconds = mp4.audio_properties.length
puts get_duration_hrs_and_mins(seconds)
end
return 值是秒,而不是毫秒,因此您需要相应地调整您的 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"