Thursday, April 2, 2009

OneSeg_Extract簡易版

player.pl差し替え版でmpeg4ファイルを作成する場合、Oneseg_Extract.exe、TSConverter.exeを呼び出す。Wineで動かしたいところだが、どちらもウインドウを開こうとするためhttpサーバから起動するのは色々厄介。TSConverterは内部からDtsEdit.exeとMP4Box.exeを起動するのだが、これらはウインドウを開かないのでWineから動かすことができる。
なので、Oneseg_Extract.exeとTSConverter.exeさえ移植すれば何とかなるわけだが、MP4Boxはportsからインストールできるし、DtsEditの最新版のソースをseraphy@管理人様に公開していただいたので、いい加減ながら移植した。
今回はとりあえずOneseg_Extractほぼ互換perlスクリプトだけ。
segwrapper.pmを使用したので簡単。最初の方の時刻関係は無くてもいいかも。
-- Oneseg_Extract.pl --
#!/usr/bin/perl
#
use Time::Local;
#
# path to "segwrapper.pm"
use lib '/usr/local/perlrtmp/lib';
use segwrapper;
#
my $outputfile=$ARGV[$#ARGV];
if($outputfile=~/(\d{6}-\d{6}-\d{6}-\d\d)\.ts$/){
  my $inputfile=$1;
  $outputfile=~/(\d{2})(\d{2})(\d{2})-\d{6}-(\d{2})(\d{2})(\d{2})-\d\d\.ts$/;
  if(time>timelocal($6,$5,$4,$3,$2-1,$1+2000)){
    my $opt = O_RDONLY | O_BINARY;
    eval { $opt |= O_LARGEFILE; };
    open(OUT,"> $outputfile") or die("can not open $outputfile for write");
    binmode(OUT);
    segwrapper::segopen(my $handle, $inputfile, $opt);
    my $packet_size = 4096;
    while(segwrapper::segread($handle, my $buf, $packet_size)) { print OUT $buf; }
    segwrapper::segclose($handle);
    exit;
  }
}
print "no record\n";
exit(-1);
残りはまた今度。

No comments: