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