SWF-Builder
view release on metacpan or search on metacpan
lib/SWF/Builder/Character/Sound/MP3.pm view on Meta::CPAN
read $f, my $content, $length - 4;
return ("\xff$header$content", $version, $channel);
}
return; # end of file
}
*_file_check = \&_get_frame;
sub _set_initial_seek {
my ($self, $f) = @_;
my $msec = $self->{_initial_seek};
my $data = '';
my $seek = 0;
my $count = 0;
my ($content, $version, $channel);
while( ($content, $version, $channel) = $self->_get_frame($f)) {
my $fsize = $samplecount[$version];
my $fmsec = $fsize * 1000 / $samplerates[$version];
$data .= $content;
$count += $fsize;
if ($msec <= 0) {
$seek += int(-$msec * $samplerates[$version] / 1000);
last;
}
$msec -= $fmsec;
$seek += $fsize;
}
return ($data, $version, $channel, $count, $seek);
}
sub _pack {
my ($self, $stream) = @_;
my $filename = $self->{_filename};
my $tag = SWF::Element::Tag::DefineSound->new;
open my $f, '<', $filename or croak "Can't find '$filename'";
binmode $f;
eval {
my ($data, $version, $channel, $count, $seek) = $self->_set_initial_seek($f);
$tag->SoundFormat(2);
$tag->SoundRate($version+1);
$tag->SoundSize(1);
$tag->SoundType($channel{$channel});
my $sd = $tag->SoundData;
$sd->add(pack('v', $seek).$data);
while(my ($content, $version) = $self->_get_frame($f)) {
$sd->add($content);
$count += $samplecount[$version];
}
$tag->SoundSampleCount($count);
$tag->SoundID($self->{ID});
$tag->pack($stream);
};
if ($@) {
croak substr($@, 1) if $@ =~ /^\*/;
die;
}
}
sub _init_streaming {
my ($self, $framerate) = @_;
my $filename = $self->{_filename};
my $htag = SWF::Element::Tag::SoundStreamHead2->new;
open my $f, '<', $filename or croak "Can't find '$filename'";
binmode $f;
my ($data, $version, $channel, $count, $seek) = $self->_set_initial_seek($f);
$htag->StreamSoundCompression(2);
$htag->StreamSoundRate($version+1);
$htag->StreamSoundSize(1);
$htag->StreamSoundType($channel{$channel});
$htag->PlaybackSoundRate($version+1);
$htag->PlaybackSoundSize(1);
$htag->PlaybackSoundType($channel{$channel});
$htag->LatencySeek($seek);
my $sc = $samplerates[$version] / $framerate;
$htag->StreamSoundSampleCount($sc);
bless {
_sound => $self,
_file => $f,
_last_sc => $count - $seek,
_swfframe_sc => $sc,
_mp3frame_sc => $count,
_last_data => $data,
_framerate => $framerate,
_header_tag => $htag,
}, 'SWF::Builder::Character::Sound::MP3::Streaming';
}
####
package SWF::Builder::Character::Sound::MP3::Streaming;
sub header_tag {
shift->{_header_tag};
}
sub next_block_tag {
my $self = shift;
my $data = $self->{_last_data};
return unless defined $data; # return undef if EOF
my $f = $self->{_file};
my $version = $self->{_last_version};
my $last_sc = $self->{_last_sc};
my $swfframe_sc = $self->{_swfframe_sc};
my $mp3frame_sc = $self->{_mp3frame_sc};
my $blockdata;
my $sc = 0;
while ($last_sc <= $swfframe_sc) {
$blockdata .= $data;
($data, $version) = $self->{_sound}->_get_frame($f);
last unless defined $data;
$sc = $samplecount[$version];
$last_sc += $sc;
$mp3frame_sc += $sc;
}
( run in 1.891 second using v1.01-cache-2.11-cpan-39bf76dae61 )