我有一个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.py
或models.py
?
我非常感谢您的任何提示或建议。希望有人可以帮助...
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)