Mux - это облачный сервис для работы с видео. Он берет на себя всю сложную часть, связанную с видео (загрузку и хранение видео, перекодирование под разные устройства и скорости интернета, стриминг видео через HLS и DASH, аналитику просмотров и качества воспроизведения).
Проще говоря, вы загружаете видео один раз, а Mux сам делает так, чтобы оно быстро и стабильно воспроизводилось на любом устройстве. Mux часто используют в SaaS-продуктах, онлайн-курсах, обучающих платформах, маркетинговых сервисах и стартапах, где видео важная часть продукта.
Как работает Mux
Процесс выглядит следующим образом:
Вы загружаете видеофайл в Mux через API;
Mux создает Asset (обработанное видео);
Для Asset создается Playback ID (публичный идентификатор для воспроизведения);
На фронтенде вы используете этот Playback ID для показа видео через плеер.
Laravel выступает как бэкенд, который отправляет видео в Mux, хранит идентификаторы видео в базе данных и управляет доступом к видео.
Как использовать в Laravel
Для того чтобы использовать Mux, сперва нужно создать аккаунт в Mux и сгенерировать ключи.
После регистрации нужно выполнить следующие шаги:
Перейти в раздел Settings → API Access.
Создайте Access Token.
Сохраните
MUX_TOKEN_IDиMUX_TOKEN_SECRET
Установка PHP SDK Mux в Laravel
Mux предоставляет официальный PHP SDK, который удобно использовать в Laravel. Устанавливаем через Composer:
composer require muxinc/mux-php
После установки SDK готов к использованию без дополнительной настройки сервис-провайдеров.
Настройка переменных окружения
Добавьте ключи Mux в файл .env:
MUX_TOKEN_ID=your_token_id
MUX_TOKEN_SECRET=your_token_secretИнициализация клиента Mux в Laravel
Создадим сервис-класс для работы с Mux app/Services/MuxService.php
namespace App\Services;
use MuxPhp\Api\AssetsApi;
use MuxPhp\Configuration;
class MuxService
{
protected AssetsApi $assetsApi;
public function __construct()
{
$config = Configuration::getDefaultConfiguration()
->setUsername(config('services.mux.token_id'))
->setPassword(config('services.mux.token_secret'));
$this->assetsApi = new AssetsApi(null, $config);
}
public function assets()
{
return $this->assetsApi;
}
}Теперь добавим конфигурацию в config/services.php
return [
'mux' => [
'token_id' => env('MUX_TOKEN_ID'),
'token_secret' => env('MUX_TOKEN_SECRET'),
],
];Загрузка видео в Mux
Самый простой вариант это загрузка видео по URL. Например, если файл уже лежит в S3 или на другом сервере.
use MuxPhp\Models\CreateAssetRequest;
use App\Services\MuxService;
$mux = app(MuxService::class);
$asset = $mux->assets()->createAsset(
new CreateAssetRequest([
'input' => 'https://example.com/video.mp4',
'playback_policy' => ['public'],
])
);Что здесь происходит:
input - это ссылка на видеофайл
playback_policy = public это значит, что видео можно воспроизводить без токена
В ответе вы получите объект Asset с ID и Playback ID.
Получение Playback ID
Playback ID нужен для воспроизведения видео на фронтенде.
$playbackId = $asset->getData()->getPlaybackIds()[0]->getId();
Этот идентификатор обычно сохраняют в базе данных, например в таблице videos.
Загрузка видео напрямую с клиента (Direct Upload)
Для больших файлов лучше использовать Direct Upload. В этом случае Laravel создает upload URL, затем фронтенд загружает видео напрямую в Mux.
use MuxPhp\Api\DirectUploadsApi;
use MuxPhp\Models\CreateUploadRequest;
use MuxPhp\Models\InputSettings;
$config = Configuration::getDefaultConfiguration()
->setUsername(config('services.mux.token_id'))
->setPassword(config('services.mux.token_secret'));
$uploadsApi = new DirectUploadsApi(null, $config);
$upload = $uploadsApi->createDirectUpload(
new CreateUploadRequest([
'new_asset_settings' => new InputSettings([
'playback_policy' => ['public'],
]),
'cors_origin' => '*',
])
);В ответе вы получите URL, на который фронтенд может загрузить видео через обычный POST.
Пример загрузки с фронтенда
<form action="UPLOAD_URL_FROM_MUX" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload</button>
</form>
После загрузки Mux сам создаст Asset и начнет обработку видео.
Воспроизведение видео
Самый простой способ это использовать HTML5 video с HLS:
<video controls width="100%">
<source src="https://stream.mux.com/PLAYBACK_ID.m3u8" type="application/x-mpegURL">
</video>Также можно использовать официальный Mux Player или любой HLS-плеер.
Защищенные видео (private playback)
Если видео не должно быть публичным:
используйте playback_policy = signed
генерируйте подписанные URL на сервере
выдавайте доступ только авторизованным пользователям
Это подходит для курсов, платного контента и внутренних сервисов.
Хранение данных в базе
Обычно в базе хранят:
mux_asset_id
mux_playback_id
статус обработки видео
Пример миграции:
Schema::create('videos', function (Blueprint $table) {
$table->id();
$table->string('mux_asset_id');
$table->string('mux_playback_id');
$table->string('status')->default('processing');
$table->timestamps();
});Вебхуки от Mux
Mux может уведомлять Laravel о событиях(видео обработано, произошла ошибка и видео удалено). Для этого нужно создать webhook endpoint в Laravel, указать его в настройках Mux.
Далее, можно обрабатывать события на стороне laravel.