Skip to main content

Django VideoField + HLSVideoField: metadata, preview frame, automatic HLS/DASH, Celery optional.

Project description

django-hlsfield

PyPI version Python 3.10+ Django 4.2+ License: MIT

🎥 Автоматическое создание адаптивного видео для Django

Django-библиотека для автоматической обработки видео с генерацией HLS/DASH стримов, превью и метаданных. Просто загрузите видео — получите адаптивный стрим с выбором качества!

✨ Возможности

  • 📹 VideoField — базовое поле с извлечением метаданных и превью
  • 🎬 HLSVideoField — автоматическая генерация HLS с несколькими качествами
  • 📺 DASHVideoField — DASH стриминг для современных браузеров
  • 🌐 AdaptiveVideoField — HLS + DASH одновременно для максимальной совместимости
  • ☁️ Любые Storage — работает с локальными файлами, S3, MinIO
  • Celery + синхронный режим — быстрая загрузка + фоновая обработка
  • 🎛️ Готовые плееры — HTML5 плееры с выбором качества

🚀 Быстрый старт

Установка

pip install django-hlsfield

Требования: ffmpeg и ffprobe должны быть установлены в системе

Настройка

# settings.py
INSTALLED_APPS = [
    # ...
    'hlsfield',
]

# Опционально: пути к бинарям
HLSFIELD_FFMPEG = "ffmpeg"   # или полный путь
HLSFIELD_FFPROBE = "ffprobe"

# Качества видео (по умолчанию)
HLSFIELD_DEFAULT_LADDER = [
    {"height": 360, "v_bitrate": 800, "a_bitrate": 96},
    {"height": 720, "v_bitrate": 2500, "a_bitrate": 128},
    {"height": 1080, "v_bitrate": 4500, "a_bitrate": 160},
]

📝 Примеры использования

1. Простое видео с метаданными

# models.py
from django.db import models
from hlsfield import VideoField

class Video(models.Model):
    title = models.CharField(max_length=200)
    video = VideoField(
        upload_to="videos/",
        duration_field="duration",      # автозаполнение длительности
        width_field="width",            # ширина кадра
        height_field="height",          # высота кадра
        preview_field="preview_image"   # путь к превью
    )

    # Поля для метаданных (опционально)
    duration = models.DurationField(null=True, blank=True)
    width = models.PositiveIntegerField(null=True, blank=True)
    height = models.PositiveIntegerField(null=True, blank=True)
    preview_image = models.CharField(max_length=500, null=True, blank=True)

# Использование
video = Video.objects.get(pk=1)
print(f"Длительность: {video.duration}")
print(f"Разрешение: {video.width}x{video.height}")
print(f"Превью: {video.video.preview_url()}")

2. HLS адаптивное видео

# models.py
from hlsfield import HLSVideoField

class Lecture(models.Model):
    title = models.CharField(max_length=200)
    video = HLSVideoField(
        upload_to="lectures/",
        hls_playlist_field="hls_master"  # поле для master.m3u8
    )
    hls_master = models.CharField(max_length=500, null=True, blank=True)

# templates/lecture_detail.html
{% if lecture.video.master_url %}
    {% include "hlsfield/players/hls_player.html" with hls_url=lecture.video.master_url %}
{% else %}
    <p>Видео обрабатывается...</p>
{% endif %}

3. Полный стек: HLS + DASH

# models.py
from hlsfield import AdaptiveVideoField

class Movie(models.Model):
    title = models.CharField(max_length=200)
    video = AdaptiveVideoField(
        upload_to="movies/",
        hls_playlist_field="hls_playlist",
        dash_manifest_field="dash_manifest",
        ladder=[  # настройка качеств
            {"height": 480, "v_bitrate": 1200, "a_bitrate": 96},
            {"height": 720, "v_bitrate": 2500, "a_bitrate": 128},
            {"height": 1080, "v_bitrate": 4500, "a_bitrate": 160},
        ]
    )
    hls_playlist = models.CharField(max_length=500, null=True, blank=True)
    dash_manifest = models.CharField(max_length=500, null=True, blank=True)

# templates/movie_detail.html
{% include "hlsfield/players/universal_player.html" with hls_url=movie.video.master_url dash_url=movie.video.dash_url %}

4. Интеграция с S3

# settings.py
from storages.backends.s3boto3 import S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    bucket_name = 'my-video-bucket'
    region_name = 'us-east-1'

DEFAULT_FILE_STORAGE = 'myapp.storage.MediaStorage'

# models.py - без изменений!
class Video(models.Model):
    video = HLSVideoField(upload_to="videos/")  # работает с S3 автоматически

5. Настройка качества и параметров

# settings.py
HLSFIELD_DEFAULT_LADDER = [
    {"height": 240, "v_bitrate": 300, "a_bitrate": 64},   # мобайл
    {"height": 480, "v_bitrate": 1200, "a_bitrate": 96},  # SD
    {"height": 720, "v_bitrate": 2500, "a_bitrate": 128}, # HD
    {"height": 1080, "v_bitrate": 4500, "a_bitrate": 160}, # Full HD
    {"height": 1440, "v_bitrate": 8000, "a_bitrate": 192}, # 2K
]

HLSFIELD_SEGMENT_DURATION = 6  # длина сегментов в секундах

# models.py - кастомное качество для конкретного поля
class PremiumVideo(models.Model):
    video = HLSVideoField(
        ladder=[
            {"height": 1080, "v_bitrate": 6000, "a_bitrate": 160},
            {"height": 1440, "v_bitrate": 12000, "a_bitrate": 192},
            {"height": 2160, "v_bitrate": 20000, "a_bitrate": 256},  # 4K
        ]
    )

🔧 Настройка Celery (рекомендуется)

Без Celery обработка видео блокирует запрос. С Celery — мгновенная загрузка + фоновая обработка.

# settings.py
INSTALLED_APPS = [
    # ...
    'hlsfield',
]

# celery.py
from celery import Celery
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

# Запуск воркера
# celery -A myproject worker -l info

🎮 Готовые плееры

Библиотека включает готовые HTML-шаблоны плееров:

<!-- HLS плеер -->
{% include "hlsfield/players/hls_player.html" with hls_url=video.master_url %}

<!-- DASH плеер -->
{% include "hlsfield/players/dash_player.html" with dash_url=video.dash_url %}

<!-- Универсальный (HLS + DASH + прямое MP4) -->
{% include "hlsfield/players/universal_player.html" with hls_url=... dash_url=... video_url=... %}

<!-- Адаптивный (автовыбор HLS/DASH) -->
{% include "hlsfield/players/adaptive_player.html" with hls_url=... dash_url=... %}

📁 Структура файлов

После обработки видео структура будет выглядеть так:

media/
└── videos/
    └── abc12345/
        ├── my_video.mp4           # оригинал
        ├── preview.jpg            # превью-кадр
        ├── meta.json             # метаданные
        └── hls/                  # HLS артефакты
            ├── master.m3u8       # главный плейлист
            ├── v360/             # качество 360p
            │   ├── index.m3u8
            │   └── seg_*.ts
            ├── v720/             # качество 720p
            │   ├── index.m3u8
            │   └── seg_*.ts
            └── v1080/            # качество 1080p
                ├── index.m3u8
                └── seg_*.ts

⚙️ Конфигурация

Настройка По умолчанию Описание
HLSFIELD_FFMPEG "ffmpeg" Путь к ffmpeg
HLSFIELD_FFPROBE "ffprobe" Путь к ffprobe
HLSFIELD_SEGMENT_DURATION 6 Длина HLS сегментов (сек)
HLSFIELD_DEFAULT_LADDER [360p, 720p, 1080p] Качества по умолчанию
HLSFIELD_SIDECAR_LAYOUT "nested" Структура файлов

🐛 Решение проблем

FFmpeg не найден

# Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg

# macOS
brew install ffmpeg

# Windows
# Скачать с https://ffmpeg.org/download.html

Большие файлы зависают

# settings.py - увеличить таймауты
FILE_UPLOAD_MAX_MEMORY_SIZE = 100 * 1024 * 1024  # 100MB
DATA_UPLOAD_MAX_MEMORY_SIZE = 100 * 1024 * 1024

Проблемы с S3

# Проверить права доступа к bucket
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = 'public-read'  # для публичных видео

🤝 Вклад в проект

  1. Fork репозитория
  2. Создайте ветку: git checkout -b feature/amazing-feature
  3. Commit изменения: git commit -m 'Add amazing feature'
  4. Push в ветку: git push origin feature/amazing-feature
  5. Откройте Pull Request

📄 Лицензия

MIT License. См. LICENSE для деталей.

🎯 Roadmap

  • Автотесты и CI/CD
  • WebVTT субтитры и превью-спрайты
  • GPU-ускорение через NVENC/VAAPI
  • Поддержка HEVC/AV1 кодеков
  • Интеграция с CDN (CloudFront, Cloudflare)

Сделано с ❤️ для Django-сообщества

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_hlsfield-1.0.0.tar.gz (17.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_hlsfield-1.0.0-py3-none-any.whl (22.4 kB view details)

Uploaded Python 3

File details

Details for the file django_hlsfield-1.0.0.tar.gz.

File metadata

  • Download URL: django_hlsfield-1.0.0.tar.gz
  • Upload date:
  • Size: 17.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.5

File hashes

Hashes for django_hlsfield-1.0.0.tar.gz
Algorithm Hash digest
SHA256 d8fd40b4fa9db903cae37f36c5c7e4988f50029f62f03bdee89d15d54ffb7bce
MD5 5176cc9d35c29d2d65799307b71dc25e
BLAKE2b-256 0e8a62b05acf83fb15a01217d8f2d91f806857c67f7dc91a50c58d640c2acea9

See more details on using hashes here.

File details

Details for the file django_hlsfield-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_hlsfield-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 61eba9f2ea932af7c33b83b73508dca8c805ae5afc0c2d5d5ddab78810b6e917
MD5 014bd440d8358415b35ee627a0f8ab28
BLAKE2b-256 821ef77f344aa38664aefe4a09b2d5278455e4f1e995301699a6ee158cba3146

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page