Module: M4S::M3U8::MediaPlaylist

Defined in:
lib/m4s/m3u8/media_playlist.rb

Class Method Summary collapse

Class Method Details

.generate(mp4, track, init_segment_path:, segment_path:) ⇒ Object



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