Django Rest Framework-如何从上传的视频中创建GIF文件

问题描述 投票:0回答:1

我有一个Django Rest Framework + Android App,用户可以在其中将一些视频文件上传到我的本地Django开发服务器。我想通过RecyclerView将视频显示为GIF文件。我认为在服务器端(Django)上创建GIF文件比在客户端(设备)上创建GIF文件更有效。

因此,我想在存储视频文件之前根据上传的视频制作GIF文件。如何在Django中做到这一点?

这里是我的models.py

class Video(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    text = models.CharField(max_length=100, blank=True)
    video = models.FileField(upload_to='Videos/',
                              blank=True)

    class Meta:
        ordering = ('created', )

这是我的views.py的样子:

# used for displaying & creating video items 
class VideoList(generics.ListCreateAPIView):
    queryset = Video.objects.all()
    serializer_class = VideoSerializer
    parser_classes = (MultiPartParser, )

    def list(self, request, *args, **kwargs):

        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)

        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)

        # the only part we change
        return Response({'videos': serializer.data})

这是urls.py,其中包含应用程序用于上传视频文件的网址:

urlpatterns = [
    ...
    path('upload/', views.VideoList.as_view())
]

可以从我的应用程序上传视频,但是我不知道该如何为上传的视频创建GIF文件版本。哪一种是实现此目标的最佳方法,以及如何将其嵌入到与Django相关的文件中,例如views.pymodels.py

我非常感谢您的任何提示或建议。希望有人可以帮助...

python android django django-rest-framework animated-gif
1个回答
0
投票
from moviepy.editor import *

clip = (VideoFileClip("frozen_trailer.mp4")
            .subclip((1,22.65),(1,23.2))
            .resize(0.3))
clip.write_gif("use_your_head.gif")

kris_sven = (VideoFileClip("frozen_trailer.mp4")
                 .subclip((1,13.4),(1,13.9))
                 .resize(0.5)
                 .crop(x1=145,x2=400)) # remove left-right borders
kris_sven.write_gif("kris_sven.gif")

anna_olaf = (VideoFileClip("frozen_trailer.mp4")
             .subclip(87.9,88.1)
             .speedx(0.5) # Play at half speed
             .resize(.4))

snapshot = (anna_olaf
            .crop(x2= anna_olaf.w/2) # remove right half
            .to_ImageClip(0.2) # snapshot of the clip at t=0.2s
            .set_duration(anna_olaf.duration))

composition = CompositeVideoClip([anna_olaf, snapshot])
composition.write_gif('anna_olaf.gif', fps=15)

import moviepy.video.tools.drawing as dw

anna_kris = (VideoFileClip("frozen_trailer.mp4", audio=False)
             .subclip((1,38.15),(1,38.5))
             .resize(.5))

# coordinates p1,p2 define the edges of the mask
mask = dw.color_split(anna_kris.size, p1=(445, 20), p2=(345, 275),
                      grad_width=5) # blur the mask's edges

snapshot = (anna_kris.to_ImageClip()
            .set_duration(anna_kris.duration)
            .set_mask(ImageClip(mask, ismask=True))

composition = CompositeVideoClip([anna_kris,snapshot]).speedx(0.2)
# 'fuzz' (0-100) below is for gif compression
composition.write_gif('anna_kris.gif', fps=15, fuzz=3)

def time_symetrize(clip):
    """ Returns the clip played forwards then backwards. In case
    you are wondering, vfx (short for Video FX) is loaded by
    >>> from moviepy.editor import * """
    return concatenate([clip, clip.fx( vfx.time_mirror )])

clip = (VideoFileClip("frozen_trailer.mp4", audio=False)
        .subclip(36.5,36.9)
        .resize(0.5)
        .crop(x1=189, x2=433)
        .fx( time_symetrize ))

clip.write_gif('sven.gif', fps=15, fuzz=2)

olaf = (VideoFileClip("frozen_trailer.mp4", audio=False)
        .subclip((1,21.6),(1,22.1))
        .resize(.5)
        .speedx(0.5)
        .fx( time_symetrize ))

# Many options are available for the text (requires ImageMagick)
text = (TextClip("In my nightmares\nI see rabbits.",
                 fontsize=30, color='white',
                 font='Amiri-Bold', interline=-25)
        .set_pos((20,190))
        .set_duration(olaf.duration))

composition = CompositeVideoClip( [olaf, text] )
composition.write_gif('olaf.gif', fps=10, fuzz=2)

castle = (VideoFileClip("frozen_trailer.mp4", audio=False)
          .subclip(22.8,23.2)
          .speedx(0.2)
          .resize(.4))

d = castle.duration
castle = castle.crossfadein(d/2)

composition = (CompositeVideoClip([castle,
                                   castle.set_start(d/2),
                                   castle.set_start(d)])
               .subclip(d/2, 3*d/2))

composition.write_gif('castle.gif', fps=5,fuzz=5)
© www.soinside.com 2019 - 2024. All rights reserved.