У меня проблема с получением источника потокового видео с помощью django
У меня возникла проблема с тегом video в chrome, потому что я хочу иметь возможность переходить к определенному времени на видео, google chrome не позволяет это сделать, потому что это требует определенного вида ответа, после проведения некоторых исследований я пришел к этому посту на stackoverflow
после добавления кода, я установил конечную точку на исходном теге видео вот так <source src="{% url 'namespace:stream_video' obj.video.path %}" type="video/mp4" />
даже сделал это следующим образом
<source src="{% url 'namespace:stream_video' path=obj.video.path %}" type="video/mp4" />
Но я получаю NoReversMatch
'stream_video' with arguments '('/home/UserName/Work/projectName/media/uploads/2022/8/3/b3f10ea2-b323-4398-a86c-c5fb5936cfd723.mp4',)' not found. 1 pattern(s) tried: ['video\\-stream/(?P<path>[^/]+)\\Z']
Путь path("stream/<str:path>", views.stream_video, name="stream_video")
А это мой взгляд, он буквально копирует взгляд из поста:
def stream_video(request, path):
range_header = request.META.get('HTTP_RANGE', '').strip()
range_match = range_re.match(range_header)
size = os.path.getsize(path)
content_type, encoding = mimetypes.guess_type(path)
content_type = content_type or 'application/octet-stream'
if range_match:
first_byte, last_byte = range_match.groups()
first_byte = int(first_byte) if first_byte else 0
last_byte = int(last_byte) if last_byte else size - 1
if last_byte >= size:
last_byte = size - 1
length = last_byte - first_byte + 1
resp = StreamingHttpResponse(RangeFileWrapper(open(path, 'rb'), offset=first_byte, length=length), status=206, content_type=content_type)
resp['Content-Length'] = str(length)
resp['Content-Range'] = 'bytes %s-%s/%s' % (first_byte, last_byte, size)
else:
resp = StreamingHttpResponse(FileWrapper(open(path, 'rb')), content_type=content_type)
resp['Content-Length'] = str(size)
resp['Accept-Ranges'] = 'bytes'
return resp
По какой-то странной причине, возможно из-за косой черты в пути, это вызывает ошибку NoReverseMatch. Поэтому я сделал следующее: использовал id объекта в представлении для получения объекта и установил путь для stream_video в none, затем передал путь в функцию. Вот как теперь выглядит функция.
def stream_video(request, video_id):
vid = Video.objects.get(id=video_id)
path = vid.field_name.path
...
path("video-stream/<video_id>/", views.stream_video, name="stream_video")
<source src="{% url 'namespace:stream_video' video_id=video.id %}" type="video/mp4" />
Вот что у меня получилось в итоге.