Sha256: b76cdaf8b3bb5e9a5528d9b234452408539d5f6760e4397700b37aa7c77056b7

Contents?: true

Size: 1.22 KB

Versions: 3

Compression:

Stored size: 1.22 KB

Contents

#!/usr/bin/env ruby

$: << File.join(File.dirname(__FILE__), "..", "lib")
require 'ffi-libav'

def write_frame(filename, frame)
  file = File.new(filename, "w")
  file.write "P6\n%d %d\n255\n" % [frame.width, frame.height]

  data = frame.av_frame[:data][0]
  linesize = frame.av_frame[:linesize][0]
  bytes_per_row = 3 * frame.width

  frame.height.times do |row|
    file.write data.slice(row * linesize, bytes_per_row)\
                   .read_string_length(bytes_per_row)
  end
  file.close
end

# Open our video file
reader = Libav::Reader.new(ARGV[0], :pixel_format => :rgb24)

reader.dump_format
# Find the first video stream
stream = reader.streams.select { |s| s.discard = :all; s.type == :video } .first

# Tell the library to discard all non-key frames
stream.discard = :nonkey

# Write the first five key frames to disk
5.times do |i|
  frame = stream.next_frame
  write_frame("image-%d.ppm" % i, frame)
  puts "wrote frame %d" % frame.number
end

stream.pixel_format = :gray8

# Write the first five key frames to disk
5.times do |i|
  frame = stream.next_frame
  scaled = frame.scale(:width => 100, :height => 100, :pixel_format => :rgb24)
  write_frame("small-%d.ppm" % i, scaled)
  puts "wrote small frame %d" % scaled.number
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ffi-libav-0.3.0 examples/extract_keyframes.rb
ffi-libav-0.2.0 examples/extract_keyframes.rb
ffi-libav-0.1.0 examples/extract_keyframes.rb