javascript - 谷歌云平台存储 JSON API 上传会破坏音频文件..?!怎么修?

标签 javascript jquery ffmpeg google-cloud-storage

我确实设法使用 GCP 可恢复上传(json api)将文件上传到 Google 存储:
https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload

使用 jQuery 和 Plupload http://www.plupload.com

但是现在看来,音频文件在上传时会丢失它们的编解码器,并且那些不会播放或 ffmpeg 无法探测那些。更多测试表明,实际上 .flac 文件对 ffmpeg 是可以的,但例如 .m4a 文件就不行。

我需要将大部分音频文件上传到谷歌存储,并能够使用 ffmpeg 探测这些文件。并且必须能够上传超过 100Mb 的大文件。这就是为什么我相信 JSON API 是最好的或唯一可能的方式。

我想我也正确添加了元数据,但现在我很困惑如何继续..
有什么想法可能是这里的问题吗?

编辑(更多信息):

我有工作软件:

  • 使用常规 POST >/temp > Google Cloud Storage Client (php)。
  • GCP 存储客户端完美上传文件。
  • 即使我用随机唯一名称命名上传的文件,如“woeiwehf.tmp”,这些文件确实有效,ffmpeg 可以很好地探测它们。

  • 然后发生了一些事情,我想像这样的上传是有限的(或什么):
  • 这意味着我的解决方案无法再上传超过 32Mb 的大文件。
  • 好吧,无论如何这都不是最好的解决方案,所以没关系,这改变了。

  • 现在:
  • 我已经更改了软件,所以它使用 GCP JSON API 上传恢复,这主要工作
  • 但我不得不将文件更改为看起来像“woeiwehf.flac”或任何类型的文件。 “.tmp”不再起作用。
  • 例如 .flac 文件可以很好地工作,但 .m4a 则不行。
  • 我已经测试了许多不同的上传方式,似乎 JSON API 上传至少会丢失编解码器和比特率。

  • --

    如果我能得到如何解决这个问题的帮助,我将不胜感激。
    我想一个解决方案可能是 fork ffmpeg 客户端并手动设置音频编解码器,但我将其保存为最后一个解决方案。

    最佳答案

    1. 对 Google json API 的 POST 请求必须完全如 Google docs 所说

    (例如:https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload)

    最后我使它与这个问题的答案一起工作:
    Upload file to Google cloud storage from Google App Engine (Java)

    感谢用户https://stackoverflow.com/users/3371862/renaud-t

    function uploadFile(fileData, bucket) {
        var boundary = '-------314159265358979323846';
        var delimiter = "\r\n--" + boundary + "\r\n";
        var close_delim = "\r\n--" + boundary + "--";
        var reader = new FileReader();
        reader.readAsBinaryString(fileData);
    
        reader.onload = function (e) {
            var contentType = fileData.type || 'application/octet-stream';
            var metadata = {
                'name': fileData.name,
                'mimeType': contentType
            };
            var base64Data = btoa(reader.result);
            var multipartRequestBody =
                    delimiter +
                    'Content-Type: application/json\r\n\r\n' +
                    JSON.stringify(metadata) +
                    delimiter +
                    'Content-Type: ' + contentType + '\r\n' +
                    'Content-Transfer-Encoding: base64\r\n' +
                    '\r\n' +
                    base64Data +
                    close_delim;
    
            var request = gapi.client.request({
                'path': '/upload/storage/v1/b/' + bucket + '/o',
                'method': 'POST',
                'params': {'uploadType': 'multipart'},
                'headers': {
                    'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
                },
                'body': multipartRequestBody
            });
    
            try {
                request.execute(function (resp) {
                    if (resp.hasOwnProperty("error")) {
                        //Treat Error
                    } else {
                        //Treat Success
                    }
                });
            }
            catch (e) {
                //Treat Error
            }
    
        };
    
    }
    

    2.使用谷歌API客户端库Javascript

    https://developers.google.com/api-client-library/javascript/start/start-js

    GAPI 客户端指南说您应该使用“then”方法,所以我稍微更改了上面的代码。
    var request = gapi.client.request({
      'path': url,
      'method': 'POST',
      'params': {'uploadType': 'multipart'},
      'headers': {
        'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
      },
      'body': multipartRequestBody
    }).then(function(response) {
        // Handle response
      }, function(reason) {
        // Handle error
      }
    );
    

    关于javascript - 谷歌云平台存储 JSON API 上传会破坏音频文件..?!怎么修?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46178999/

    相关文章:

    javascript - 如何在单击另一个 div 时使用 JS 或 JQuery 甚至 Bootstrap 隐藏一个 div?

    javascript - 通过 jquery 更改 webkit-slider-thumb 的背景图像

    jQuery UI 对话框冲突

    ffmpeg - IP 摄像机如何通过家庭网络传输视频

    javascript - 揭示模块模式和范围

    javascript - D3 在 X 轴上平移直线时,沿 mousemove 中断的路径移动圆

    javascript - 如何让这些 JavaScript 按钮发挥作用?

    javascript - 我的 JSON.parse 有什么问题,为什么代码没有按出现的顺序执行?

    audio - 如何将 AUDIO 组与 VIDEO 流结合并使用 ffmpeg 生成新的 .ts 文件?

    asp.net - 使用 ASP.NET JQuery 在 MedisElement 中显示大型视频文件的问题