Ошибка логики расчета таймкода в PHP + Code Igniter - PullRequest
0 голосов
/ 08 июня 2010

Я подозреваю, что у меня логическая проблема с алгоритмом, который я использую для работы с тайм-кодом видео в PHP.Приветствуется вся помощь.

Цель

Ну, в общем, я хочу работать с временным кодом и выполнять вычисления

Для тех, кто не знаком с временным кодом, это выглядиткак это

01: 10: 58: 12 или ЧЧ: ММ: СС: FF 'AKA' ЧАСЫ: МИНУТЫ: СЕКУНДЫ: КАДРЫ

Я использовал скрипт из ЗДЕСЬ , чтобы помочь мне в работе с этим форматом.

Проблема

Теперь я могу просто сказать, что этоскрипт работает !!!Расчет тайм-кода (в данном случае дополнения) выполняется правильно.Однако этот скрипт постоянно выдает следующие ошибки, но все равно выдает правильный вывод, когда я пытаюсь выполнить следующие вычисления

00: 01: 26: 00 + 00: 02: 00: 12

Ошибки этого расчета показаны ниже

Обнаружена ошибка PHP

Серьезность: Уведомление

Сообщение: Неопределенный индекс: ключ

Имя файла: staff / tools.php

Номер строки: 169

Обнаружена ошибка PHP

Серьезность: Уведомление

Сообщение: неопределенный индекс: ключ

Имя файла: staff / tools.php

Номер строки: 169

Номер строки169 находится в функции parseInput ()

// feed it into the tc array
$i=0;
foreach ($tc AS $key=>$value) {
    if ( is_numeric($array["$i"]) ) {
        $tc["$key"]= $array["$i"];
        if ($tc["$key"] < 10 && $tc["$key"] > 0 && strlen($tc['key'])==1 ) $tc["$key"]= "0".$tc["$key"];
        }
    $i++;
    }

return $tc;

Теперь я должен также упомянуть, что число раз, когда вышеупомянутая ошибка выдается, зависит от того, что я вычисляю

00: 00: 00: 00 + 00: 00: 00: 00

не возвращает ошибок.

01: 01: 01: 01 + 02:02: 02: 02

выдает 8 из указанных выше ошибок.


Для справки, вот полный код

function add_cue_sheet_clips_process()
{

$sheetID = $_POST['sheet_id'];
$clipName = $_POST['clip_name'];
$tcIn = $_POST['tc_in'];
$tcOut = $_POST['tc_out'];

// string $input
// returns an associative array of hours, minutes, seconds, and frames
//
function parseInput ($input) {
// timecode should look something like hh:mm:ss;ff
// allowed separators are : ; . ,
// values may be single or double digits
// hours are least-significant -- 5.4 == 00:00:05;04
$tc= array("frames"=>"00", "seconds"=>"00", "minutes"=>"00", "hours"=>"00");
$punct= array(":", ";", ".", ",");

// too big? too small?
$input= trim($input);
if (strlen($input)>11 || $input=="") {
    // invalid input, too long -- bzzt
    return $tc;
    }

// normalize punctuation
$input= str_replace( $punct, ":", $input);

// blow it up and reverse it so frames come first
$array= explode(":", $input);
$array= array_reverse($array);

// feed it into the tc array
$i=0;
foreach ($tc AS $key=>$value) {
    if ( is_numeric($array["$i"]) ) {
        $tc["$key"]= $array["$i"];
        if ($tc["$key"] < 10 && $tc["$key"] > 0 && strlen($tc['key'])==1 ) $tc["$key"]= "0".$tc["$key"];
        }
    $i++;
    }

return $tc;
}

// array $tc
// returns a float number of seconds
//
function tcToSec($tc) {
    $wholeseconds= ($tc['hours']*3600) + ($tc['minutes'] * 60) + ($tc['seconds']);
    $partseconds= ( $tc['frames']  / 25 );
    $seconds= $wholeseconds + $partseconds;
    return $seconds;
    }

// float $seconds
// bool $subtract
// returns a timecode array
//
function secToTc ($seconds=0, $subtract=0) {
    $tc= array("frames"=>"00", "seconds"=>"00", "minutes"=>"00", "hours"=>"00");

    $partseconds= fmod($seconds, 1);
    $wholeseconds= $seconds - $partseconds;

    // frames
    if ($subtract==1) $tc['frames']= floor( $partseconds * 25 );
    else $tc['frames']= floor( $partseconds * 25 );

    // hours
    $tc['hours']= floor( $wholeseconds / 3600 );
    $minsec= ($wholeseconds - ($tc['hours'] * 3600));

    // minutes
    $tc['minutes']= floor( $minsec / 60 );

    // seconds
    $tc['seconds']= ( $minsec - ($tc['minutes'] * 60) );

    // padding
    foreach ( $tc AS $key=>$value ) {
        if ($value > 0 && $value < 10) $tc["$key"]= "0".$value;
        if ($value=="0") $tc["$key"]= "00";
        }
    return $tc;
    }

// array $tc
// returns string of well-formed timecode
//
function tcToString (&$tc) {
    return $tc['hours'].":".$tc['minutes'].":".$tc['seconds'].";".$tc['frames'];
    }


$timecodeIN = parseInput($tcIn);
$timecodeOUT = parseInput($tcOut); 

// normalized inputs...
$tc1 = tcToString($timecodeIN);
$tc2 = tcToString($timecodeOUT);

// get seconds
$seconds1 = tcToSec($timecodeIN);
$seconds2 = tcToSec($timecodeOUT);

$result = $seconds1 + $seconds2;

$timecode3 = secToTc($result, 0);
$timecodeDUR = tcToString($timecode3);

$clipArray = array('clip_name' => $clipName, 'tc_in' => $tcIn, 'tc_out' => $tcOut, 'tc_duration' => $timecodeDUR);

$this->db->insert('tools_cue_sheets_clips', $clipArray);

redirect('staff/tools/add_cue_sheet_clips/'.$sheetID);
}

Я надеюсь, что этого достаточно, чтобы кто-то помог мнеВдобавок ко всему, я был бы чрезвычайно признателен.

Спасибо,

Тим

1 Ответ

1 голос
/ 08 июня 2010

УВЕДОМЛЕНИЕ Ошибки обычно незначительны, вот пример

if($unamedVaraible){/.../} //Notince: undefined variable

if(isset($unamedVaraible)){/..../} //no error as its checking correctly for the purpose

из вас сделано

error_reporting(E_ALL ^ E_NOTICE); ///Show all errors but E_NOTICE

вы сможете подавить эти ошибки.

Вы найдете функцию error_reporting (), расположенную в верхней части основного файла index.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...