5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# File 'lib/m4s/m3u8/media_playlist.rb', line 5
def generate(mp4, track, init_segment_path:, segment_path:)
track_id = track.fetch('track_id')
timescale = track.fetch('timescale').to_f
init_file = [init_segment_path, "init-#{track_id.pred}.mp4"].compact.join
segment_durations_seconds = mp4.segment_duration_ticks_by_index(track_id).map { |s| s.fetch('duration') / timescale }
target_duration = segment_durations_seconds.max.to_f.ceil.clamp(1, nil)
lines = [
'#EXTM3U',
"#EXT-X-TARGETDURATION:#{target_duration}",
'#EXT-X-VERSION:7',
'#EXT-X-MEDIA-SEQUENCE:0',
'#EXT-X-PLAYLIST-TYPE:VOD',
'#EXT-X-INDEPENDENT-SEGMENTS',
%(#EXT-X-MAP:URI="#{init_file}"),
]
segment_durations_seconds.each_with_index do |duration, index|
lines << "#EXTINF:#{format('%.6f', duration)},"
lines << [segment_path, "chunk-#{track_id.pred}-#{format('%05d', index.next)}.m4s"].compact.join('/')
end
lines << '#EXT-X-ENDLIST'
"#{lines.join("\n")}\n"
end
|