繁体   English   中英

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

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

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

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

有人可以帮我指向相同的文档。 基本上,我将在 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 应用程序中用户对象的外键。 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()”检查并返回临时 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM