2008/3/13 木曜日

圧縮されたFLV(CWS)を解凍(FWS)する CWS to FWS

Filed under: flv — admin @ 12:16:41

FLVでたまにMP3を分離できないものがある。
具体的にはヘッダが通常FWSのところがCWSになっているものである。
CWSになっているのは圧縮フォーマットになっているもので、
実は単純にZlibで圧縮されているだけなのだが、
Windowsで手軽に変換できるツールが出回ってなかったりする。

DOSであれば

Flash decompressor
というのがあって試してみたんだけどうまく動かなかった。

perlの場合

perl -MCPAN -e shell
cpan> install Compress::Zlib
% cat cws2fws.pl
#!/usr/bin/perl     

use Compress::Zlib;     

$in = STDIN;     

read $in,$header,8;     

die 'not CWS' if $header !~ /^CWS/;     

undef $/; # enable slurp mode
$buffer = <$in>;     

#$buffer = compress($buffer) ;
$buffer = uncompress($buffer) ;
$header =~ s/^C/F/;     

$out = STDOUT;
print $out $header;
print $out $buffer;

pythonの場合

#!/usr/bin/env python     

# convert from CWS to FWS.
# usage: swf-uncompress.py in.swf out.swf     

import sys
import zlib     

argc = len(sys.argv)     

if argc < 2 or sys.argv[1] == '-':
  infile = sys.stdin
else:
  infile = open(sys.argv[1])     

header = infile.read(8)
if header[:3] != 'CWS':
  sys.stderr.write('not compressed.n')
  sys.exit(1)     

header = header.replace('CWS', 'FWS', 1)     

if argc < 3 or sys.argv[2] == '-':
  outfile = sys.stdout
else:
  outfile = open(sys.argv[2], 'w')     

outfile.write(header)
outfile.write(zlib.decompress(infile.read()))

w3m その5

No Tags