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 )