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