Skip to content

Instantly share code, notes, and snippets.

@kkuprikov
Created October 22, 2019 13:17
Show Gist options
  • Save kkuprikov/cf05a64b80c44baf051ea7a09b79dfb8 to your computer and use it in GitHub Desktop.
Save kkuprikov/cf05a64b80c44baf051ea7a09b79dfb8 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'json'
require 'pry'
url = "rtmp://fms.105.net/live/rmc1"
BITS_IN_BYTE = 8
BYTES_IN_KB = 1024
def compute_data type: 'video', frames: 1000, url:
out = JSON.parse(`ffprobe -loglevel error -show_frames -of json -read_intervals \"%+\##{frames}\" #{url}`)['frames']
video = out.select{|e| e['media_type'] == 'video'}
keyframe_index = video.select{|e| e['key_frame'] == 1}.map{ |e| video.index(e) }
puts keyframe_index
video_indexes = get_keyframe_interval(keyframe_index)
res = [out.index(video[video_indexes.first]), out.index(video[video_indexes.last])]
data = {}
if (res.size == 2)
data[:gop_size] = video_indexes.last - video_indexes.first
data[:width] = out[res.last]['width']
data[:height] = out[res.last]['height']
data.merge!(get_bitrate(out, res.first, res.last))
end
data
end
def get_bitrate input, i1, i2
time = (input[i2]['pkt_pts_time'].to_f - input[i1]['pkt_pts_time'].to_f).ceil(3)
video_bytes = input[i1..i2].select{|e| e['media_type'] == 'video'}
.map{ |e| e['pkt_size'].to_i }
.reduce(:+)
audio_bytes = input[i1..i2].select{|e| e['media_type'] == 'audio'}
.map{ |e| e['pkt_size'].to_i }
.reduce(:+)
bytes = video_bytes + audio_bytes
bitrate = ((bytes * BITS_IN_BYTE) / (time * BYTES_IN_KB)).ceil
fps = (input[i1..i2].select{|e| e['media_type'] == 'video'}.size / time).ceil(3)
{ time_offset: time, bitrate: bitrate, fps: fps }
end
def get_keyframe_interval(keyframe_index)
res = []
keyframe_index.each_with_index do |e, i|
if i == keyframe_index.size - 1
res << e if res.size == 1
break
end
next if (keyframe_index[i+1] == e + 1) && res.empty?
res << e
break if res.size == 2
end
res
end
puts(compute_data(url: url))
# puts keyframe_interval
# puts out['frames'].map{|e| e['key_frame']}
# puts out.keys
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment