如何使用Django创建视频缩略图?

aiazj4mn  于 2023-04-22  发布在  Go
关注(0)|答案(3)|浏览(150)

我在我的django网站显示我的视频.我想显示这些视频像缩略图,但我不知道如何为我的视频创建缩略图.我已经通过管理模块存储我的视频.这里是我的代码
models.py

class Video(models.Model):
    title = models.CharField(max_length=200, null=True, blank=True)
    video = models.FileField(upload_to='static/gallery/videos',
                             null=False,
                             help_text=_("video file")
                            )

admin.py

from django.contrib import admin
from .models import Video

admin.site.register(Video)

任何一个帮助我如何存储我的视频缩略图格式在数据库或如何显示我检索到的视频缩略图格式。
先谢谢你了

rekjcdws

rekjcdws1#

您可以添加一个可空的文件字段来存储缩略图,并在save方法中手动填充或使用模型保存信号。
您可以使用这些问题的答案来了解如何生成这些缩略图:
https://stackoverflow.com/a/1843043/1823497
https://stackoverflow.com/a/27565893/1823497
由于生成缩略图可能是一项耗时的工作,我建议使用celery task在后台完成,而不会阻塞您的Web服务器。

au9on6nz

au9on6nz2#

1)安装opencv-python 2)检查文件是视频还是图像3)我不知道从内存中视频捕获,所以将文件写入磁盘,然后使用cv2.videocapture加载4)取第一帧并写入磁盘5)再次从磁盘加载图像并保存在数据库6)删除磁盘中的临时文件

import mimetypes
import cv2
from django.core.files import File
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from pathlib import Path

    

    new_story=Story(user=user, file=file)
    file_type, t =mimetypes.guess_type(str(file))
    
    if file_type.split('/')[0] == "image":
        new_story.save() 
        return Storymutation(story=new_story)
    path = default_storage.save('video.mp4', ContentFile(file.read()))
    vidcap = cv2.VideoCapture(f"./media/{path}")
    success,image = vidcap.read()
    cv2.imwrite(f"./media/{path}.jpeg", image)
    thumbnail = default_storage.open(f"{path}.jpeg")
    new_story.thumbnail=thumbnail
    new_story.save()
    thumbnail.close()
    del image, vidcap
    default_storage.delete(path)
    default_storage.delete(f"{path}.jpeg")
    return Storymutation(story=new_story)
bxfogqkk

bxfogqkk3#

这里是一个生成缩略图的例子。你可以根据Django项目的需要调整代码。
我用的是ffmpeg-python: Python bindings for FFmpeg

import ffmpeg

from django.core.files.base import ContentFile
from django.core.files.temp import NamedTemporaryFile

with NamedTemporaryFile() as temp_video_file:
    # user_video is a django model instance with video and thumbnail FileFields
    in_memory_file = user_video.video

    if in_memory_file.multiple_chunks():
        for chunk in in_memory_file.chunks():
            temp_video_file.write(chunk)
    else:
        temp_video_file.write(in_memory_file.read())

    try:
        probe = ffmpeg.probe(temp_video_file.name)
        time = float(probe["streams"][0]["duration"]) // 2
        width = probe["streams"][0]["width"]

        with NamedTemporaryFile(suffix=".jpg") as temp_thumbnail_file:
            (
                ffmpeg.input(temp_video_file.name, ss=time)
                .filter("scale", width, -1)
                .output(temp_thumbnail_file.name, vframes=1)
                .overwrite_output()
                .run(capture_stdout=True, capture_stderr=True)
            )

    except ffmpeg.Error as e:
        # do whatever you want with the error
        error = e.stderr.decode()
    else:
        # you can also just return the thumbnail e.g
        # return ContentFile('name_you_like.jpg', temp_thumbnail_file.read())
        user_video.thumbnail.save(
            Path(temp_thumbnail_file.name).name,
            ContentFile(temp_thumbnail_file.read()),
            save=True,
        )

相关问题