Создание эскизов видео для всех файлов в каталоге с помощью FFmpeg и PHP

Я искал по всему Google и StackOverFlow, но все еще не нашел решения для этого.

Я хочу создать миниатюру видео для всех видеофайлов mp4 в каталоге и назвать миниатюры как "filename.mp4" .jpg

У меня на сервере установлены ffmpeg и ffmpeg-php. Мне также удалось создать эскизы по одному файлу за раз.

Итак, это ситуация, у меня есть каталог с именем uploads, в котором есть много видео в формате mp4. Теперь, когда я запускаю скрипт, миниатюра размером 100x100 должна быть создана автоматически и помещена в другую папку «skrin». Например: xxx.mp4 должен иметь имя xxx.mp4.jpg имеет имя большого пальца.

ВАЖНО: В именах моих файлов есть пробелы, одинарные кавычки, скобки и т. Д. В именах файлов. Итак, сценарий должен уметь справиться с этим.

Кто-нибудь может мне помочь? Я использую следующую команду оболочки в php, используя exec для создания большого пальца отдельного видео.

exec("/usr/local/bin/ffmpeg -itsoffset -105 -i 'xxx haha.mp4' -vcodec mjpeg -vframes 1 -an -f rawvideo -s 100x100 'xxx haha.mp4.jpg'");

person Hashid Hameed    schedule 02.02.2012    source источник


Ответы (2)


Это просто быстрый:

$videos_dir = 'path/to/videos';
$videos_dir = opendir($videos_dir);
$output_dir = 'path/to/output/dir/';
while (false !== ($file = readdir($videos_dir))) {
    if ($file != '.' && $file != '..'){
        $in = $videos_dir.'/'.$file;
        $out = $output_dir.$file.'.jpg';
        exec("/usr/local/bin/ffmpeg -itsoffset -105 -i ".$in." -vcodec mjpeg -vframes 1 -an -f rawvideo -s 100x100 ".$out);
    }
}
person Sal    schedule 02.02.2012
comment
Практически именно то, что я собирался опубликовать. Вы опередили меня на 30 секунд. :) - person ghoti; 02.02.2012
comment
Единственная загвоздка в том, что OP хочет, чтобы выходные файлы назывались * .jpg. - person ghoti; 02.02.2012
comment
У меня есть место в заголовке моего видео. Как мне с этим бороться? @ghoti - person Vaibhav Kadam; 24.10.2017
comment
@VaibhavKadam ... В командной строке, запускаемой функцией exec() в этом ответе, не указаны имена файлов ($in и $out). Добавьте цитаты, и все будет хорошо. А еще лучше, для большей ясности, создайте свою команду, используя sprintf() вместо стринговых лент вместе с оператором точки. - person ghoti; 24.10.2017

попробуй это

try
    {
        $directory = 'your directory name';
        $dir = new RecursiveDirectoryIterator($directory);
        $it = new RecursiveIteratorIterator($dir);
        while($it->valid()) {

            if (!$it->isDot()) {
                //echo 'SubPathName: ' . $it->getSubPathName() . "\n";
                //echo 'SubPath:     ' . $it->getSubPath() . "\n";
                //echo 'Key:         ' . $it->key() . "\n\n";
                echo $name = $it->key(),"\n";
                exec("/usr/local/bin/ffmpeg -itsoffset -105 -i $name -vcodec mjpeg -vframes 1 -an -f rawvideo -s 100x100 $name.'.jpg'");    
            }

            $it->next();
        }
    }
    catch(Exception $e)
    {
        echo 'No files Found!<br />';
    }
person maxjackie    schedule 02.02.2012