Объединение двух видео с помощью ffmpeg - PullRequest
0 голосов
/ 10 марта 2019

У меня есть два видео. Тот, который будет загружен с youtube-dl , и тот, который сделан из изображения с ffmpeg и функцией петли.

public function createTimePic($id, $image_width, $image_height, $text) {
    $font_size = 20;
    $angle = 0;
    $font = 'public/fonts/arial.ttf';
    $im = imagecreatetruecolor($image_width, $image_height);
    $white = imagecolorallocate($im, 255, 255, 255);
    $grey = imagecolorallocate($im, 128, 128, 128);
    $black = imagecolorallocate($im, 0, 0, 0);
    imagefilledrectangle($im, 0, 0, $image_width, $image_height, $black);

    $text_box = imagettfbbox($font_size, $angle, $font, $text);
    $text_width = $text_box[2]-$text_box[0];
    $text_height = $text_box[7]-$text_box[1];
    $x = ($image_width/2) - ($text_width/2);
    $y = ($image_height/2) - ($text_height/2);

    imagettftext($im, $font_size, 0, $x, $y+1, $grey, $font, $text);
    imagettftext($im, $font_size, 0, $x, $y, $white, $font, $text);

    $file = $this->videoPath.'time_difference_'.$id.'.jpg';
    imagejpeg($im, $file);

    $video = 'time_difference_'.$id.'.mp4';
    if (!file_exists($this->videoPath.$video)) {
        $this->createVideoFromImg($file, $video);
    }

    return [
        'img' => $file,
        'video' => $video
    ];
}

public function createVideoFromImg($img, $video) {
    $command = './ffmpeg -loop 1 -i '.$img.' -t 5 -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p '.$this->videoPath.$video;
    exec($command, $output);
}

public function downloadYouTubeVideo($video_id, $audio_only = false) {
    $file_type = $audio_only ? 'mp3' : 'mp4';
    $file = $this->videoPath.$video_id.'.'.$file_type;

    if (!file_exists($file)) {
        $command = '/usr/local/bin/youtube-dl -o "'.$file.'" ';
        if ($audio_only) {
            $command .= '--extract-audio --audio-format '.$file_type.' ';
        }

        $command .= ' https://www.youtube.com/watch\?v\='.$video_id;
        exec($command, $output);

        $command = './ffmpeg -i '.$file.' -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p '.str_replace('.mp4', '', $file).'_encoded.mp4';
    }

    return $file;
}

$command = './ffmpeg -f concat -safe 0 -i list.txt -c copy '.$this->videoPath.$id.'_new1.mp4';
exec($command, $output);

Внутри моего list.txt файла находятся пути к двум видео, одно из которых было создано из jpeg, а другое - из youtube. Запуск команды внизу создает новое видео. Просто это то же самое, что и видео на YouTube. Другое изображение никогда не будет добавлено. Может ли это быть связано с кодировкой?

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