Skip to main content

django-video-encoding helps to convert your videos into different formats and resolutions.

Project description

https://img.shields.io/pypi/v/django-video-encoding.svg Build Status Coverage https://img.shields.io/pypi/pyversions/django-video-encoding.svg https://img.shields.io/pypi/status/django-video-encoding.svg https://img.shields.io/pypi/l/django-video-encoding.svg

django-video-encoding helps to convert your videos into different formats and resolutions.

Installation

  1. Install django-video-encoding

    pip install django-video-encoding
  2. Add video_encoding to your INSTALLED_APPS.

Integration

Add a VideoField and a GenericRelation(Format) to your model. You can optionally store the width, height and duration of the video by supplying the corresponding field names to the VideoField.

from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from video_encoding.fields import VideoField
from video_encoding.models import Format


class Video(models.Model):
   width = models.PositiveIntegerField(editable=False, null=True)
   height = models.PositiveIntegerField(editable=False, null=True)
   duration = models.FloatField(editable=False, null=True)

   file = VideoField(width_field='width', height_field='height',
                     duration_field='duration')

   format_set = GenericRelation(Format)

To show all converted videos in the admin, you should add the FormatInline to your ModelAdmin

from django.contrib import admin
from video_encoding.admin import FormatInline

from .models import Video


@admin.register(Video)
class VideoAdmin(admin.ModelAdmin):
   inlines = (FormatInline,)

   list_dispaly = ('get_filename', 'width', 'height', 'duration')
   fields = ('file', 'width', 'height', 'duration')
   readonly_fields = fields

The conversion of the video should be done in a separate process. Typical options are django-rq or celery. We will use django-rq in the following example. The configuration for celery is similar. django-video-encoding already provides a task (convert_all_videos) for converting all videos on a model. This task should be triggered when a video was uploaded. Hence we listen to the post-save signal and enqueue the saved instance for processing.

# signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_rq import enqueue

from video_encoding import tasks

from .models import Video


@receiver(post_save, sender=Video)
def convert_video(sender, instance, **kwargs):
    enqueue(tasks.convert_all_videos,
            instance._meta.app_label,
            instance._meta.model_name,
            instance.pk)

After a while You can access the converted videos using

video = Video.objects.get(...)
for format in video.format_set.complete().all():
   # do something

Configuration

VIDEO_ENCODING_THREADS (default: 1) Defines how many threads should be used for encoding. This may not be supported by every backend.

VIDEO_ENCODING_BACKEND (default: 'video_encoding.backends.ffmpeg.FFmpegBackend') Choose the backend for encoding. django-video-encoding only supports ffmpeg, but you can implement your own backend. Feel free to pulish your plugin and submit a pull request.

VIDEO_ENCODING_BACKEND_PARAMS (default: {}) If your backend requires some special configuration, you can specify them here as dict.

VIDEO_ENCODING_FORMATS (for defaults see video_encoding/config.py) This dictionary defines all required encodings and has some resonable defaults. If you want to customize the formats, you have to specify name, extension and params for each format. For example

VIDEO_ENCODING_FORMATS = {
    'FFmpeg': [
        {
            'name': 'webm_sd',
            'extension': 'webm',
            'params': [
                '-b:v', '1000k', '-maxrate', '1000k', '-bufsize', '2000k',
                '-codec:v', 'libvpx', '-r', '30',
                '-vf', 'scale=-1:480', '-qmin', '10', '-qmax', '42',
                '-codec:a', 'libvorbis', '-b:a', '128k', '-f', 'webm',
           ],
        },
     ]

Encoding Backends

video_encoding.backends.ffmpeg.FFmpegBackend (default)

Backend for using ffmpeg and ffprobe to convert your videos.

Options

VIDEO_ENCODING_FFMPEG_PATH Path to ffmpeg. If no path is provided, the backend uses which to locate it. VIDEO_ENCODING_FFPROBE_PATH Path to ffprobe. If no path is provided, the backend uses which to locate it.

Custom Backend

You can implement a custom encoding backend. Create a new class which inherits from video_encoding.backends.base.BaseEncodingBackend. You must set the property name and implement the methods encode, get_media_info and get_thumbnail. For further details see the reference implementation: video_encoding.backends.ffmpeg.FFmpegBackend.

If you want to open source your backend, follow these steps.

  1. create a packages named django-video-encoding-BACKENDNAME

  2. publish your package to pypi

  3. Submit a pull requests with the following changes:

    • add the package to extra_requires

    • provide reasonable defaults for VIDEO_ENCODING_FORMATS

Development

This project is using poetry to manage all dev dependencies. Clone this repository and run

poetry develop

to create a virtual enviroment with all dependencies. You can now run the test suite using

poetry run pytest

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-video-encoding-0.4.0.tar.gz (13.1 kB view details)

Uploaded Source

Built Distribution

django_video_encoding-0.4.0-py2.py3-none-any.whl (31.4 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django-video-encoding-0.4.0.tar.gz.

File metadata

  • Download URL: django-video-encoding-0.4.0.tar.gz
  • Upload date:
  • Size: 13.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/0.12.5 CPython/3.7.1 Linux/4.19.2-arch1-1-ARCH

File hashes

Hashes for django-video-encoding-0.4.0.tar.gz
Algorithm Hash digest
SHA256 c5b5fd8ea25e868d0cd056bfc63b9018e75f17bf01c5cc1ed0de5551365d7eb3
MD5 8fe30c5ce35adefa31714b6d3578b31c
BLAKE2b-256 c37e088ab12422bab6d8bf8d0042f3ea3cfe12e1a0c02b591d88984cfa30f662

See more details on using hashes here.

File details

Details for the file django_video_encoding-0.4.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_video_encoding-0.4.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 7d430d77291628095fe94a1dff42b9f043e34e6258eab04f705981ec4d99ce2b
MD5 098096e9481edbfcfc426bf3b42c2a97
BLAKE2b-256 0c00671b23ed5485ead8b5a09d0488a5a51bcbcf22bbbb2eea350e6c458d6736

See more details on using hashes here.

Supported by

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