如何在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
相关产品推荐
相关产品推荐

