在Android应用程序中将录音上传到Google App Engine

2024-04-24 05:41:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个android应用程序,可以进行基本的语音录制(存储为.mp4)。我想添加一个功能,我可以发送一个录音(只是一次一个,不需要批处理)到谷歌应用引擎云存储。然后,我希望能够在我的(非常基本的)云应用程序上收听这些录音。我不想使用blobstore,而是使用数据存储。我以前用过数据存储,但总是用云应用和python,从来没有用过android应用(我的java充其量也不稳定)。以前,我只是从appspot网站表单中获取其他数据,并使用html和python将其发送到数据存储。你知道吗

简言之,我的问题是,如何将我的录音从android应用程序传输到数据存储。代码片段和/或文档链接将非常有用。另外,简短地解释一下这些东西是如何交流/协同工作的,也能帮助我的大脑把这些点联系起来。你知道吗

请注意,这是一个个人应用程序只是为了我自己的学习和使用,所以我不太担心安全性,用户帐户,可扩展性等

谢谢你的帮助!你知道吗


Tags: 数据代码引擎功能应用程序表单网站html
1条回答
网友
1楼 · 发布于 2024-04-24 05:41:10

对于这个用例,数据存储不是一个好的存储选项,因为最大实体大小被限制为1mb。GCS是这个用例的推荐选项。另外,如果您对Java不太熟悉,可以使用Python作为GAE后端。你知道吗

关于如何将录音从Android移动到GAE GCS/数据存储的问题,您可以使用以下选项之一:

  1. 通过googleapi客户端库使用GCSjsonapi直接从Android应用程序上传。这是一个简单的选择,有大量的样品可供选择。如果您坚持使用这个库,它也可以用于Datastore。你知道吗
  2. 使用Cloud Endpoints作为代理。您可以将文件提交给端点处理程序,端点处理程序将文件保存在GCS中并返回响应。由于您不关心安全性,下面是一个不使用OAuth的示例:
import cloudstorage as gcs
import endpoints
import os

from google.appengine.api import app_identity
from protorpc import messages
from protorpc import message_types
from protorpc import remote

class Base64File(messages.Message):
    file = messages.BytesField(1, required=True, variant=messages.Variant.BYTES)

class ResponseMSG(messages.Message):
    message = messages.StringField(1)

FILE_RESOURCE = endpoints.ResourceContainer(Base64File,
                                            file_name=messages.StringField(2,required=True),
                                            content_type=messages.StringField(3,required=True))

@endpoints.api(name='gcsuploadapi', version='v0.1',
                                      description='Upload a file to GCS.')
class GCSUploadAPI(remote.Service):
    @endpoints.method(FILE_RESOURCE, ResponseMSG,
                        path='upload/{file_name}', http_method='POST',
                        name='upload.file')
    def upload_file(self, request):
        # get app default bucket and prepare filename (project should have billing enabled)
        bucket_name = os.environ.get('BUCKET_NAME',
                                 app_identity.get_default_gcs_bucket_name())
        bucket = '/' + bucket_name
        filename = bucket + '/' + request.file_name

        # create file (request.content_type contains MIME type submitted)
        write_retry_params = gcs.RetryParams(backoff_factor=1.1)
        gcs_file = gcs.open(filename, 'w',
                            content_type=request.content_type,
                            retry_params=write_retry_params)
        gcs_file.write(request.file)
        gcs_file.close()

        return ResponseMSG(message="done")

app = endpoints.api_server([GCSUploadAPI])

您不必生成客户端库,可以通过httppost直接提交。端点只支持HTTPS连接,请求与其他GAE requests受相同的限制。主要关注的是32兆字节的请求大小。考虑到提交给端点的二进制数据应该是base64编码的,因此二进制数据的大约限制为23-24mb。另一个限制是请求的截止时间为60秒,如果您为GAE应用程序使用modular approach并为端点使用后端实例,则可以解决该问题。你知道吗

这可能是最难实现的选项,但我提供的示例应该是一个良好的开端。你知道吗

  1. 使用云端点生成blobstoreapi上载url。Blobstore API允许uploading to GCS而不是Blobstore。这也是一个相当简单的选择。你知道吗

相关问题 更多 >