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

pip install django-hlsfield[all]
pip install django-hlsfield[dev]

Требования: 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.5.tar.gz (90.1 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.5-py3-none-any.whl (102.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: django_hlsfield-1.0.5.tar.gz
  • Upload date:
  • Size: 90.1 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.5.tar.gz
Algorithm Hash digest
SHA256 6a9ff15e69fd64d170a196a23ce0d9efaf7936b25c96d65642ccf9faa2d6a07f
MD5 4f7eafda6c53194f03dc633249712028
BLAKE2b-256 23757331c9b1034ab46e16db1032dac59ce3049a4ea54da5aa7e55aa1af59bdc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for django_hlsfield-1.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 93481b4d38cd7bfe85e3183edd8e64496722a0ce2108b44bc0cf673027733f33
MD5 37fc93440c9606d9f3097d41aa197ccc
BLAKE2b-256 046ee2b99609cef8a558f44df6f9a1ff33ff0a32e48a76645fd778876bea57d4

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