Условные форматы в Laravel FFMPEG

#php #laravel #ffmpeg

#php #laravel #ffmpeg

Вопрос:

В настоящее время я использую Laravel FFMPEG в проекте Laravel и выполняю следующие действия, которые хорошо работают https://github.com/protonemedia/laravel-ffmpeg

Вот пример кода, который работает:

  $lowBitrate = (new X264)->setKiloBitrate(250);
            $midBitrate = (new X264)->setKiloBitrate(500);
            $highBitrate = (new X264)->setKiloBitrate(1000);
            $superBitrate = (new X264)->setKiloBitrate(1500);

            FFMpeg::open('steve_howe.mp4')
                ->exportForHLS()
                ->addFormat($lowBitrate, function($media) {
                    $media->addFilter('scale=640:480');
                })

                 ->addFormat($midBitrate, function($media) {
                    $media->scale(960, 720);
                })
                ->addFormat($highBitrate, function ($media) {
                    $media->addFilter(function ($filters, $in, $out) {
                        $filters->custom($in, 'scale=1920:1200', $out); // $in, $parameters, $out
                    });
                })
                ->addFormat($superBitrate, function($media) {
                    $media->addLegacyFilter(function ($filters) {
                        $filters->resize(new FFMpegCoordinateDimension(2560, 1920));
                    });
                })
                ->save('adaptive_steve.m3u8');
 

Теперь моя задача заключается в том, что на стороне клиента моим пользователям необходимо выбрать, какие форматы они хотели бы включить в задание перекодирования, и одно задание может содержать 2 изменения битрейта или более, поэтому перед вызовом -> addFromat() необходимо иметь условный оператор

В идеале мне нужно было бы подойти к этому:

  $lowBitrate = (new X264)->setKiloBitrate(250);
        $midBitrate = (new X264)->setKiloBitrate(500);
        $highBitrate = (new X264)->setKiloBitrate(1000);
        $superBitrate = (new X264)->setKiloBitrate(1500);

        FFMpeg::open('steve_howe.mp4')
            ->exportForHLS()
            ->addFormat($lowBitrate, function($media) {
                $media->addFilter('scale=640:480');
            })
             /// adding if statement here
             ->addFormat($midBitrate, function($media) {
                $media->scale(960, 720);
            })
            ->addFormat($highBitrate, function ($media) {
                $media->addFilter(function ($filters, $in, $out) {
                    $filters->custom($in, 'scale=1920:1200', $out); // $in, $parameters, $out
                });
            })
            ->addFormat($superBitrate, function($media) {
                $media->addLegacyFilter(function ($filters) {
                    $filters->resize(new FFMpegCoordinateDimension(2560, 1920));
                });
            })
            ->save('adaptive_steve.m3u8');
 

Понятия не имею, как добавить сюда оператор if / else. Как вы думаете, я должен подойти к этому?

Спасибо

Ответ №1:

Мы могли бы использовать условный трейлинг следующим образом:

 $ffmpeg = FFMpeg
   ::open('steve_howe.mp4')
   ->exportForHLS()
   ->addFormat($lowBitrate, function($media) {
       $media->addFilter('scale=640:480');
   });

//condition here:
if (true) { 
   $ffmpeg = $ffmpeg->addFormat($midBitrate, function($media) {
       $media->scale(960, 720);
   });
}
// 2nd condition here:
if (true) { 
   $ffmpeg = $ffmpeg->addFormat($highBitrate, function ($media) {
       $media->addFilter(function ($filters, $in, $out) {
           $filters->custom($in, 'scale=1920:1200', $out); // $in, $parameters, $out
       });
   });
}

$ffmpeg->save('adaptive_steve.m3u8');