Autor Zpráva
MaxDJs
Profil
Zdravím,

bylo by možno mi poradit jak sestavit skript, který bude procházet .srt soubor a ke každému času přičte časový posun? Stačí poradit kostru a já skript sestavím.

.srt soubor je v tomto formátu

1
00:00:07,517 --> 00:00:09,417
Existuje Misto,


Díky za odpověď
Majkl578
Profil
1. načíst soubor přes file_get_contents
2. pomocí preg_replace_callback postupně najít každý výskyt času a v callbacku upravit (přičíst čas, milisekundy to trochu komplikují)
3. uložit pomocí file_put_contents
Adrifinel
Profil
Agiesub je program na tvorbu titulku, můžeš si pomocí něho vyspravit časování. Jinak být tebou tak bych naplánovala procházejí i ass souboru.
Alphard
Profil
Použijte jak chcete, za nic neručím.
<style type="text/css">
    td { padding: 3px 10px; }
</style>
<?php

$filenameIn = 'name.srt';
$filenameOut = 'name.srt';
$start = '00:41:00.000';
$shift = -1.0;

$in = file($filenameIn);

$st = array();
$i = 0;
$time = false;
$last = '';

while ($line = array_shift($in))
{
    $line = trim($line);
    if (is_numeric($line) && empty($last))
    {
        $i++;
        $time = true;
        $last = $line;
        continue;
    }
    $last = $line;
    if ($time)
    {
        $e = explode(' ', $line);
        $st[$i]['timeStart'] = timeToFloat($e[0]);
        $st[$i]['timeEnd'] = timeToFloat($e[2]);
        $time = false;
        continue;
    }
    if (!empty($line))
    {
        $st[$i]['text'][] = $line;
    }
}

echo "<table>\n";
foreach ($st as $key => $line)
{
    $s = $line['timeStart'] >= timeToFloat($start) ? $shift : 0;
    echo "<tr><td>$key</td>";
    echo "<td>".floatToTime($line['timeStart']);
    echo " - ".floatToTime($line['timeEnd'])."</td>";
    echo "<td>".floatToTime($line['timeStart']+$s);
    echo " - ".floatToTime($line['timeEnd']+$s)."</td><td>";
    foreach ($line['text'] as $t)
    {
        echo $t, "<br>";
    }
    echo "</td></tr>\n";
}
echo "</table>\n";

$out = '';
foreach ($st as $key => $line)
{
    $s = $line['timeStart'] >= timeToFloat($start) ? $shift : 0;

    $out .= $key.PHP_EOL;
    $out .= floatToTime($line['timeStart']+$s);
    $out .= ' --> ';
    $out .= floatToTime($line['timeEnd']+$s).PHP_EOL;
    foreach ($line['text'] as $t)
    {
        $out .= $t.PHP_EOL;
    }
    $out .= PHP_EOL;
}
file_put_contents($filenameOut, $out);

function timeToFloat($time)
{
    $e = explode(':', $time);
    $e[2] = strtr($e[2], ',', '.');
    $f = 3600*$e[0] + 60*$e[1] + (float) $e[2]; 
    return $f;
    
}

function floatToTime($f)
{
    $h = floor($f/3600); $f -= 3600*$h;
    $m = floor($f/60); $f -= 60*$m;
    $s = $f;
    $h = str_pad($h, 2, '0', STR_PAD_LEFT);
    $m = str_pad($m, 2, '0', STR_PAD_LEFT);
    $s = str_pad(number_format($s, 3, ',', ''), 6, '0', STR_PAD_LEFT);
    return "$h:$m:$s";
    
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0