JJ The Second
JJ The Second

Reputation: 97

Conditional formats in Laravel FFMPEG

I'm currently using Laravel FFMPEG in a Laravel project and running followings which works well https://github.com/protonemedia/laravel-ffmpeg

Here is an example of code that is working:

 $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 \FFMpeg\Coordinate\Dimension(2560, 1920));
                    });
                })
                ->save('adaptive_steve.m3u8');

Now, my challenge is that on client side, my users need to select what formats they'd like to include in transcoding job and one job may contain 2 bitrate variation or more so there is a need to have a conditional statement before calling ->addFromat()

Ideally I'd need to approach this:

 $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 \FFMpeg\Coordinate\Dimension(2560, 1920));
                });
            })
            ->save('adaptive_steve.m3u8');

No idea how to add a if/else statement here. How do you think I should approach this?

Thanks

Upvotes: 0

Views: 801

Answers (1)

Stefano Amorelli
Stefano Amorelli

Reputation: 4854

We could use conditional trailing as follows:

$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');

Upvotes: 2

Related Questions