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

How to use Django Rest API for Video streaming Android application?

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

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

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

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

提前致谢。

以下是可能设计的粗略轮廓。我不知道你项目的细节,所以我做了很多假设。如果您使用的是 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

这是做什么的?它创建了一个 table 来存储 S3 文件 ID(在 content_key 列中),并且每个文件都有一个 owner ,它是 django 应用程序中用户对象的外键。 generate_download_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()" 检查并 return 临时 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