手把手教你搭建数字档案馆视频归档系统
环境搭建:Python与FFmpeg深度集成
在构建数字档案馆系统之前,必须先准备好运行环境。本系统基于Python 3.9与Django 4.2框架开发,核心依赖FFmpeg进行视频转码与标准化处理。请严格按照以下步骤执行环境初始化。
1. 安装基础依赖库
首先更新系统源并安装Python环境管理工具及FFmpeg。FFmpeg是视频处理的核心,务必确保版本大于4.0。
Ubuntu/Debian系统执行
sudo apt-get update
sudo apt-get install python3.9 python3-pip ffmpeg
对于CentOS系统,使用以下命令:
CentOS系统执行
sudo yum install epel-release
sudo yum install python39 python39-pip ffmpeg
2. 创建项目虚拟环境
为了避免依赖冲突,强烈建议使用虚拟环境。执行以下命令创建并激活名为digital_archive的虚拟环境。
创建虚拟环境
python3.9 -m venv venv
激活虚拟环境
source venv/bin/activate
3. 安装Python项目依赖
安装Django框架、处理视频的Python库以及图像处理库Pillow(用于生成视频封面)。
pip install django==4.2 ffmpeg-python pillow
项目初始化与数据模型构建
环境就绪后,开始构建Django项目结构。我们将创建一个名为archive_system的主项目,以及一个专门处理视频归档的应用video_app。
1. 创建Django项目与应用
创建项目
django-admin startproject archive_system
进入项目目录
cd archive_system
创建应用
python manage.py startapp video_app
2. 配置settings.py
打开archive_system/settings.py,进行以下关键配置。必须注册应用,配置媒体文件存储路径,并设置用户上传文件大小限制。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'video_app', 注册创建的应用
]
配置媒体文件存储路径(用于存储视频和封面)
import os
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
限制上传文件大小为100MB(数字档案馆通常处理大文件,可根据需求调整)
DATA_UPLOAD_MAX_MEMORY_SIZE = 104857600
FILE_UPLOAD_MAX_MEMORY_SIZE = 104857600
3. 定义VideoArchive模型
在video_app/models.py中定义数据模型。数字档案馆的核心是元数据管理,因此我们需要包含标题、描述、原始文件、转码后的标准文件以及缩略图。
from django.db import models
class VideoArchive(models.Model):
title = models.CharField(max_length=200, verbose_name="档案标题")
description = models.TextField(blank=True, verbose_name="档案描述")
upload_time = models.DateTimeField(auto_now_add=True, verbose_name="归档时间")
原始上传文件
original_file = models.FileField(upload_to='original_videos/', verbose_name="原始视频")
转码后的标准MP4文件
archived_file = models.FileField(upload_to='archived_videos/', blank=True, null=True, verbose_name="标准归档视频")
视频封面缩略图
thumbnail = models.ImageField(upload_to='thumbnails/', blank=True, null=True, verbose_name="视频封面")
处理状态
status = models.CharField(max_length=20, default='pending', choices=[
('pending', '等待处理'),
('processing', '转码中'),
('completed', '已归档'),
('failed', '处理失败')
], verbose_name="处理状态")
class Meta:
verbose_name = "视频档案"
verbose_name_plural = "视频档案"
def __str__(self):
return self.title
核心功能:视频转码与标准化处理
数字档案馆要求视频格式具有长期的兼容性。我们将编写核心逻辑,利用FFmpeg将用户上传的任意格式视频转码为标准的H.264编码、MP4封装格式,并自动提取第一帧作为封面。
1. 编写转码工具类
在video_app目录下创建utils.py文件,编写具体的转码逻辑。这里使用ffmpeg-python库来构建FFmpeg命令。
import ffmpeg
import os
from django.conf import settings
def process_video(video_instance):
"""
核心转码函数:将视频转为H.264 MP4并提取封面
"""
try:
video_instance.status = 'processing'
video_instance.save()
input_path = video_instance.original_file.path
生成输出文件名
file_name = os.path.basename(input_path)
output_name = f"archived_{file_name.rsplit('.', 1)[0]}.mp4"
output_path = os.path.join(settings.MEDIA_ROOT, 'archived_videos', output_name)
确保输出目录存在
os.makedirs(os.path.dirname(output_path), exist_ok=True)
1. 视频转码:H.264视频编码 + AAC音频编码
(
ffmpeg
.input(input_path)
.output(
output_path,
vcodec='libx264', 视频编码格式
acodec='aac', 音频编码格式
preset='veryfast', 转码速度
crf=23, 画质控制 (18-28, 越小质量越高)
movflags='faststart' 优化网络播放
)
.overwrite_output()
.run(capture_stdout=True, capture_stderr=True)
)
2. 提取第一帧作为封面
thumbnail_name = f"thumb_{file_name.rsplit('.', 1)[0]}.jpg"
thumbnail_path = os.path.join(settings.MEDIA_ROOT, 'thumbnails', thumbnail_name)
(
ffmpeg
.input(input_path, ss='00:00:01') 截取第1秒
.output(thumbnail_path, vframes=1)
.overwrite_output()
.run(capture_stdout=True, capture_stderr=True)
)
3. 更新数据库字段
video_instance.archived_file.name = f'archived_videos/{output_name}'
video_instance.thumbnail.name = f'thumbnails/{thumbnail_name}'
video_instance.status = 'completed'
video_instance.save()
return True
except Exception as e:
print(f"转码失败: {e}")
video_instance.status = 'failed'
video_instance.save()
return False
业务接口:上传与列表展示
接下来编写视图逻辑,处理用户的上传请求和档案列表展示。为了简化操作,我们直接在视图中调用转码函数(生产环境建议使用Celery异步处理)。
1. 配置URL路由
首先在archive_system/urls.py中配置全局路由,并开启静态文件服务支持(用于开发时显示媒体文件)。
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('video_app.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
在video_app目录下创建urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('upload/', views.upload_video, name='upload_video'),
]
2. 编写Views视图
在video_app/views.py中实现上传和列表逻辑。
from django.shortcuts import render, redirect
from .models import VideoArchive
from .utils import process_video
def index(request):
获取所有已归档的视频
videos = VideoArchive.objects.all().order_by('-upload_time')
return render(request, 'index.html', {'videos': videos})
def upload_video(request):
if request.method == 'POST':
title = request.POST.get('title')
description = request.POST.get('description')
video_file = request.FILES.get('video_file')
if video_file:
创建档案记录
archive = VideoArchive.objects.create(
title=title,
description=description,
original_file=video_file
)
执行转码处理
process_video(archive)
return redirect('index')
return render(request, 'upload.html')
前端交互页面实现
在video_app目录下创建templates文件夹,并在其中创建HTML文件。
1. 上传页面 (upload.html)
视频档案上传
上传视频档案
返回列表
2. 列表展示页面 (index.html)
数字档案馆
已归档视频列表
上传新档案
{% for video in videos %}
-
{{ video.title }}
状态: {{ video.get_status_display }}
{% if video.thumbnail %}
{% endif %}
{% if video.archived_file %}
{% endif %}
描述: {{ video.description }}
{% empty %}
暂无归档视频。
{% endfor %}
部署运行与效果验证
代码编写完成后,最后一步是执行数据库迁移并启动服务进行验证。
1. 数据库迁移与注册Admin
为了方便后台管理,在video_app/admin.py中注册模型。
from django.contrib import admin
from .models import VideoArchive
admin.site.register(VideoArchive)
执行迁移命令生成数据库表结构:
python manage.py makemigrations
python manage.py migrate
2. 创建超级用户(可选)
如果需要通过Django Admin后台管理数据,执行:
python manage.py createsuperuser
3. 启动服务
启动Django开发服务器:
python manage.py runserver 0.0.0.0:8000
4. 实操验证步骤
- 访问上传页面:浏览器打开
http://localhost:8000/upload/。 - 上传测试文件:选择一个非MP4格式的视频文件(如MOV或AVI),输入标题和描述,点击提交。
- 观察处理结果:提交后页面会跳转回列表页。初次刷新可能显示“转码中”或“等待处理”,等待几秒后刷新页面。
- 确认归档成功:状态应更新为“已归档”,并显示视频封面图。点击“播放标准归档视频”链接,应能在浏览器中直接流畅播放转码后的MP4文件。