swf2ass/swf2ass.php

86 lines
2.6 KiB
PHP

<?php
require_once __DIR__ . "/vendor/autoload.php";
const SWFMILL_BINARY = "swfmill";
const TWIP_SIZE = 20;
const ADVANCED_MOTION_INTERPOLATION = true;
ob_start();
passthru(escapeshellarg(SWFMILL_BINARY) . " swf2xml " . escapeshellarg($argv[1]) . " stdout");
$contents = ob_get_contents();
ob_end_clean();
$swf = new \DOMDocument();
$swf->loadXML($contents);
$soundStream = "";
$fp = fopen($argv[2], "w+");
$headerTag = $swf->getElementsByTagName("Header")->item(0);
if ($headerTag instanceof DOMElement) {
$processor = new \swf2ass\SWFProcessor($headerTag);
$assRenderer = new \swf2ass\ass\ASSRenderer($processor->getFrameRate(), $processor->getViewPort());
$keyFrameInterval = 10 * $processor->getFrameRate(); //kf every 10 seconds
$frameOffset = 0;
while(($frame = $processor->nextFrameOutput()) !== null){
$audio = $processor->getAudio();
if($audio !== null and $frameOffset === 0){
if($audio->start === null){
continue;
}
$frameOffset = $audio->start;
}
$frame->setFrameOffset($frameOffset);
$rendered = $frame->getFrame()->render(0, [], \swf2ass\ColorTransform::identity(), \swf2ass\MatrixTransform::identity());
$drawCalls = 0;
$drawItems = 0;
$clipCalls = 0;
$clipItems = 0;
foreach ($rendered->getObjects() as $object){
if($object->clip !== null){
++$clipCalls;
$clipItems += count($object->clip->edges);
}
foreach ($object->drawPathList->commands as $path){
++$drawCalls;
$drawItems += count($path->commands->edges);
}
}
echo "=== frame ".$frame->getFrameNumber()." ~ $frameOffset : Depth count: " . count($frame->getFrame()->getDepthMap()) . " :: Object count: " . count($rendered->getObjects()) ." :: Paths: $drawCalls draw calls, $drawItems items :: Clips: $clipCalls draw calls, $clipItems items" . PHP_EOL;
foreach ($assRenderer->renderFrame($frame, $rendered) as $line){
fwrite($fp, $line . "\n");
}
if($frame->getFrameNumber() > 0 and $frame->getFrameNumber() % $keyFrameInterval === 0){
foreach ($assRenderer->flush() as $line){
fwrite($fp, $line . "\n");
}
}
}
foreach ($assRenderer->flush() as $line){
fwrite($fp, $line . "\n");
}
/*foreach (\swf2ass\Utils::processSWF($headerTag, $soundStream) as $line) {
fwrite($fp, $line);
};*/
}
/*
if($soundStream !== ""){
file_put_contents($argv[2] . ".mp3", $soundStream);
}*/
fclose($fp);