【问题标题】:Upload and download of images,video to firebase storage to/from android app is too slow将图像、视频上传和下载到 Android 应用程序的 Firebase 存储太慢
【发布时间】:2019-01-29 16:37:30
【问题描述】:

我正在开发一个 Android 应用程序,其中包括上传/下载到 Firebase 存储的照片和视频。我对 firebase 的功能非常满意,但是即使我在高速互联网上,上传/下载图像和视频也需要更多时间。

图片和视频的上传和下载工作完美,但我不能指望 Google 支持的平台会运行缓慢。我在上传之前压缩图像,尽管花费的时间更多。比如说。我在 WhatsApp 个人资料图片上上传了 7Mb 大小的图片,它将在最多 5-6 秒内完成。但在我的 Android 应用中,同样的图片上传需要 60 多秒。

伙计们,如果您有更好的解决方案或您的任何实施,请分享。

问候, 斯里尼

【问题讨论】:

  • 上传速度取决于图片的大小、质量和压缩以及您的互联网带宽(上游)的上行速度,我认为您应该尝试调整图片大小和/或压缩图片。
  • 据我所知,您必须在 firebase 上仅上传 url,您必须在自己的服务器上上传大文件。

标签: android firebase google-cloud-firestore firebase-storage


【解决方案1】:

这都是关于媒体压缩的。 您还可以通过压缩媒体来上传与 WhatsApp 相同的图像、视频和其他媒体文件。 压缩后检查firebase的上传和下载速度。你也会感受到它的速度。

这里是压缩工具

还有更多。 我正在使用这两个库来压缩视频和图像文件。

以这种方式使用 firebase 上传。

File file =new File(mediaPath);
        if(file.exists()) {
            UploadTask uploadTask = riversRef.putFile(Uri.fromFile(file),metadata);
            Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                    if (!task.isSuccessful()) {
                        throw task.getException();
                    }

                    // Continue with the task to get the download URL
                    return riversRef.getDownloadUrl();
                }
            }).addOnCompleteListener(task -> {
                if (task.isSuccessful()) {
                    Uri downloadUri = task.getResult();
                    getUploadedMediaPath.getUploadedFileUrl(downloadUri.toString());
                }
            });
        }

【讨论】:

  • 我在上传之前在我的代码中包含了图像和媒体压缩。文件在上传之前被压缩到 1:10 的比例,例如 7 MB 的图像被压缩并存储在 Firebase 存储中到大约 70KB 的图像。图像质量也很好。但我无法理解为什么这需要超过 60 秒。
  • 还需要同样的时间吗?
  • 是的。我想知道是否可以使用 Firebase 进行照片和图像共享 Android 应用程序。因为我搜索了很多并且力求找到任何解决方案。许多人引用图片/视频的上传和下载速度很慢,使用 Firebase 存储。
  • 请检查我更新的答案。希望它可以帮助你。对我来说更快。我正在使用相同的功能来上传图像、视频和音频文件。
【解决方案2】:

试试这个

// Get the data from an ImageView as bytes
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();

UploadTask uploadTask = mountainsRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle unsuccessful uploads
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
        // ...
    }
});

【讨论】:

  • 我已经尝试过同样的方法,并在上传之前包含了图像压缩。图像压缩也可以正常工作。除了上传需要一些额外的时间之外,一切都很好。
【解决方案3】:

您是否尝试过使用 WebP 和 WebM 来查看照片和视频?

这是由 Google 的某个团队开发的一种格式,旨在在不大幅改变文件质量的情况下尽可能减少文件大小。与其他格式的图像和视频相比,结果非常好。 WebP 也支持编码器和解码器。

在此处查看 WebP 工具:

https://developers.google.com/speed/webp/

只需下载该工具并将其放在您的工作文件夹中,调用命令提示符并运行

cwebp -q int fileName.jpg -o fileName.webp

看看结果。

查看用于 WebM 的工具:

https://www.webmproject.org/

【讨论】:

    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 2016-11-20
    • 2019-04-07
    • 1970-01-01
    • 2021-04-27
    • 2021-07-19
    • 1970-01-01
    • 2020-06-01
    相关资源
    最近更新 更多