Group
Extension

Media-Convert/lib/Media/Convert/KeyframeFinder.pm

package Media::Convert::KeyframeFinder;

use v5.28;
use Moose;

use JSON::MaybeXS qw/decode_json/;
use autodie qw/:all/;

has 'asset' => (
	is => 'ro',
	isa => 'Media::Convert::Asset',
	required => 1,
);

has 'keyframes' => (
	is => 'ro',
	isa => 'ArrayRef[Num]',
	lazy => 1,
	builder => '_build_keyframes',
);

sub _build_keyframes {
	my $self = shift;

	local $/ = "";
        my @pipe = ("ffprobe", "-loglevel", "quiet", "-print_format", "json", "-show_format", "-select_streams", "v", "-skip_frame", "nokey", "-show_frames", "-show_entries", "frame=pts_time,pict_type,best_effort_timestamp_time", $self->asset->url);
        say "Running: '". join("' '", @pipe) . "'";
	open my $jsonpipe, "-|:encoding(UTF-8)", @pipe;
	my $data = decode_json(<$jsonpipe>);
	my $rv = [];
        my $offset = $data->{format}{start_time} // 0;
	foreach my $frame(@{$data->{frames}}) {
		next unless $frame->{pict_type} eq "I";
		push @$rv, ($frame->{pts_time} // $frame->{best_effort_timestamp_time}) - $offset;
	}
	return $rv;
}

no Moose;

1;


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.