Помогите с ffmpeg, метод toGDImage()

N
На сайте с 14.06.2004
Offline
107
1528

Создаю скриншоты и когда практически обработано все видео выдает ошибку:

Fatal error: Call to a member function toGDImage() on a non-object in

Код который создает скриншоты:

$movie = new ffmpeg_movie("video.avi");

$frames_count = $movie->getFrameCount();
echo "Count - ".$frames_count."<br>";
$frames_rate = $movie->getFrameRate();
echo "Rate - ".$frames_rate."<br>";
$seconds = ceil($frames_count/$frames_rate);
echo "Seconds - ".$seconds."<br>";
for($k=1; $k<=$seconds-17; $k=$k+15)
{
$j++;
$frame = ceil($k*$frames_rate);
echo $frame."<br>";
$image = $movie->getFrame($frame);
$show_img = $image->toGDImage();
imagejpeg($show_img, "photos/".$j.".jpg");
}

Вот результат работы скрипта:

Count - 21216 - к-во кадров

Rate - 20 - кадров в секунду

Seconds - 1061 - секунд в видео

20 - номер кадра из которого делаем скриншот

320

620

.........

8120

8420

Fatal error: Call to a member function toGDImage() on a non-object in

Почему возникает такая ошибка. Останавливается на 8420 кадре, а ведь кадров всего 21216...

И такая ошибка возникает практически для каждого видео

N
На сайте с 06.05.2007
Offline
419
#1
Nicca:
Почему возникает такая ошибка. Останавливается на 8420 кадре, а ведь кадров всего 21216..

Да там тысяча и одна причина. Форматы видео все разные. ffmpeg постоянно меняется. дошло до того, что у них теперь две крупные ветки - libav и ffmpeg.

Я бы работал с внешней программой. Ее обновлять удобнее и php она не порушит.

Fatal error: Call to a member function toGDImage() on a non-object in

Все подобные ошибки означают, что создание объекта в коде чуть выше не удалось.

то есть, вызов $image = $movie->getFrame($frame); не вернул правильный объект, потому что произошла ошибка. А какая именно, вы узнаете после того как сделаете проверку и вывод ошибок на этом этапе.

Кнопка вызова админа ()
N
На сайте с 14.06.2004
Offline
107
#2

Подскажите как выполнить таку проверку, а то я не силен в ооп:

$image = $movie->getFrame($frame)
if($image == 'true') // Какое здесь должно быть условие? Сейчас выдает ошибку
{
$show_img = $image->toGDImage();
imagejpeg($show_img, "photos/".$j.".jpg");
}
N
На сайте с 06.05.2007
Offline
419
#3

Согласно документации возвращается либо объект либо false

вот так должно быть нормально

if (!$image) {

Но вот почему frame not found может быть уже не понятно из документации.

Предположу, что это расширение не дает возможности отмотать назад и считать всю информацию необходимую для реконструкции кадра, если он базируется на других предыдущих. Можно попробовать доставать штук 30-60 следующих и какой-нибудь из них окажется опорным, будет содержать всю информацию и объект создастся.

У внешней программы ffmpeg такой проблемы нет. Она просто читает поток подряд и создает картинки.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий