You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中部署python-ffmpeg-video-streaming生成的MPD/M3U8视频流

Django中提供DASH/HLS流式视频服务的解决方案

你的问题核心在于:仅返回MPD文件不足以实现流式播放——MPD文件中引用的视频分片(chunk)没有被Django正确暴露,浏览器无法找到这些分片资源。以下是具体解决步骤:

1. 配置媒体文件服务

首先需要让Django(或生产环境的Web服务器)能够访问到生成的MPD、M3U8及分片文件。

开发环境配置

在项目的settings.py中添加媒体文件路径配置:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 所有媒体文件存放根目录
MEDIA_URL = '/media/'  # 媒体文件的访问URL前缀

在项目根urls.py中添加媒体路由(仅开发环境使用):

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 你的其他路由配置
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

生产环境建议

不要让Django直接处理媒体文件,用Nginx等Web服务器直接映射MEDIA_ROOT目录到MEDIA_URL路径,性能更优。

2. 调整视频生成路径

将python-ffmpeg-video-streaming生成的DASH/HLS文件,输出到MEDIA_ROOT目录下,确保Django能访问到。示例代码:

from django.conf import settings
import os
from ffmpeg_streaming import Dash

# 源视频路径
source_video = os.path.join(BASE_DIR, 'videos', 'source.mp4')
# 输出目录(自动创建)
output_dir = os.path.join(settings.MEDIA_ROOT, 'dashpath')
os.makedirs(output_dir, exist_ok=True)

# 生成DASH格式视频
dash = Dash(source_video)
dash.auto_generate_representations()
dash.output(os.path.join(output_dir, 'dash.mpd'))

3. 优化前端与访问方式

方案一:直接通过媒体URL访问MPD(推荐)

不需要自定义视图,直接在前端使用媒体URL加载MPD文件:

<div class="video-container">
    <video id="my-video" class="video-js" controls preload="auto" width="640" height="264"
           data-setup="{}">
        <source src="{{ MEDIA_URL }}dashpath/dash.mpd" type="application/dash+xml">
    </video>
</div>

<script>
    var player = videojs('my-video');
</script>

方案二:带权限验证的视图(如需控制访问)

如果需要对视频访问做权限校验,可自定义视图返回MPD,并确保分片文件能通过媒体路由访问:

from django.http import HttpResponse, HttpResponseNotFound
from django.conf import settings
import os

def stream_dash_video(request):
    mpd_file_path = os.path.join(settings.MEDIA_ROOT, 'dashpath', 'dash.mpd')
    
    if not os.path.exists(mpd_file_path):
        return HttpResponseNotFound("MPD文件不存在")
    
    with open(mpd_file_path, 'rb') as f:
        response = HttpResponse(f.read(), content_type='application/dash+xml')
        response['Content-Length'] = os.path.getsize(mpd_file_path)
        return response

此时前端src使用视图的URL即可:

<source src="{% url 'stream_dash_video' %}" type="application/dash+xml">

关键说明

之前的代码报错是因为MPD文件中记录的分片路径是相对路径,浏览器会基于MPD的请求URL去加载分片,但你的原始视图没有暴露分片文件所在的./dashpath/目录,导致分片无法被找到。将文件转移到MEDIA_ROOT并配置媒体路由后,分片的相对路径会自动映射到正确的访问URL,解决找不到的问题。

内容的提问来源于stack exchange,提问作者Sandeep Prasad Kushwaha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:15:02