Reputation: 97
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
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