Что такое Mux и зачем он нужен на примере Laravel

Mux - это облачный сервис для работы с видео. Он берет на себя всю сложную часть, связанную с видео (загрузку и хранение видео, перекодирование под разные устройства и скорости интернета, стриминг видео через HLS и DASH, аналитику просмотров и качества воспроизведения).

Проще говоря, вы загружаете видео один раз, а Mux сам делает так, чтобы оно быстро и стабильно воспроизводилось на любом устройстве. Mux часто используют в SaaS-продуктах, онлайн-курсах, обучающих платформах, маркетинговых сервисах и стартапах, где видео важная часть продукта.

Как работает Mux

Процесс выглядит следующим образом:

  1. Вы загружаете видеофайл в Mux через API;

  2. Mux создает Asset (обработанное видео);

  3. Для Asset создается Playback ID (публичный идентификатор для воспроизведения);

  4. На фронтенде вы используете этот Playback ID для показа видео через плеер.

Laravel выступает как бэкенд, который отправляет видео в Mux, хранит идентификаторы видео в базе данных и управляет доступом к видео.

Как использовать в Laravel

Для того чтобы использовать Mux, сперва нужно создать аккаунт в Mux и сгенерировать ключи.

После регистрации нужно выполнить следующие шаги:

  1. Перейти в раздел Settings → API Access.

  2. Создайте Access Token.

  3. Сохраните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.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Почему простые архитектуры выигрывают: уроки системного дизайна от инженера GitHub

Почему сложность в архитектуре - зло, и как инженеры GitHub подходят к системному дизайну без фанатизма. Простые решения, вертикальное масштабирование, эволюция вместо переписывания и разбор ключевых идей.

18 0 1 мин

Как установить Docker и Docker Compose на Ubuntu и RedHat системы (2025)

Подробная инструкция по установке Docker и Docker Compose на Debian-based и RedHat-based системы. Разбор всех команд по шагам, настройка GPG-ключей, добавление репозиториев, запуск сервиса, проверка и устранение типичных ошибок.

33 0 2 мин