django-video-encoding helps to convert your videos into different formats and resolutions.
Install django-video-encoding
pip install django-video-encoding
Add
video_encoding
to yourINSTALLED_APPS
.
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
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', ], }, ]
Backend for using ffmpeg
and ffprobe
to convert your videos.
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.
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.
- create a packages named django-video-encoding-BACKENDNAME
- publish your package to pypi
- Submit a pull requests with the following changes:
- add the package to
extra_requires
- provide reasonable defaults for
VIDEO_ENCODING_FORMATS
- add the package to
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