如何使用 Django Rest API 用于视频流 Android 应用程序?



我正在构建一个应用程序,用于上传和存储用户生成的视频内容,并且他的网络中的少数人可以访问该内容。我正在为同样的事情编写一个基于Django的REST API。

我必须探索如何在Android应用程序中流式传输视频内容,并了解Exoplayer。但它要求运行视频文件的 URL。我不想公开 URL(如果他知道 URL,任何人都可以访问(,而是我想首先对用户进行身份验证并检查他是否有访问权限,然后只让人们流式传输该视频。所以,我一直在搜索很多,但找不到如何在 Exoplayer 或 android 上的任何媒体播放器中输入获取请求。

有人可以帮我指出相同的文档吗?基本上,我将在 Django 中工作以获取所需的视频文件。另外,我是否必须从服务器端做一些不同的事情来处理这个问题。

编辑:另外,我想知道我是否在Django Rest API中返回完整的文件,如果我寻求尚未下载的播放器时间,Exoplayer(或任何其他播放器(是否能够流式传输。基本上,如果 API 一次返回整个文件,这些播放器会管理查找部分吗?

提前谢谢。

以下是可能设计的粗略概述。我不知道你的项目的细节,所以我做了很多假设。如果您使用的是 S3,则需要使用 boto 客户端。但在此之前,请确保存储桶中的所有文件都是私有的。获取应用程序的访问密钥,以便您可以对 S3 进行 API 调用。然后,一旦你拥有了这一切,你可以这样:

创建新的videofile应用并定义VideoFile模型:

import boto3 as boto
from django.conf import settings
from django.db import models
class VideoFile(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
name = models.CharField(max_length=75)
content_key = models.CharField(max_length=200, unique=True)
def generate_download_url(self, ):
s3 = boto.client('s3')
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': settings.S3_BUCKET_NAME,
'Key': self.content_key
}
)
return url
def __str__(self):
return self.name

这是做什么的?它创建一个存储 S3 文件 ID 的表(在content_key列中(,每个文件都有一个owner,它是 django 应用程序中 User 对象的外键。generate_download_url生成预签名 URL,这些 URL 会在一段时间后过期。

要将新视频上传到 S3,可能如下所示:

def create_document(file_object, key_name, owner):
try:
s3 = boto.resource('s3')
s3.Object(settings.S3_BUCKET_NAME, key_name).put(Body=file_object)
except Exception, err:
print("Could not create object in s3")
return
video_file = VideoFile.objects.create(owner=owner, name=file_object.name, content_key=key_name)
return video_file

最后,您可以在相应的 DRF 视图中执行"is_friend_of(("检查并返回临时 URL。

class FileStreamUrl(APIView):
def get(self, request):
my_man = User.objects.get(...)
if request.user.is_friend_of(my_man):
video_file = some_user.objects.video_file_set.filter(...)
url = video_file.generate_download_url()
return Response(url)
else:
return Response(status=403) # Forbidden

相关内容

最新更新