簡體   English   中英

使用Javascript AWS開發工具包將使用Cordova Media Capture插件捕獲的視頻上傳到S3

[英]Uploading to S3 a video captured using Cordova Media Capture plugin using Javascript AWS SDK

嘗試將視頻文件(.mp4和.mov)上傳到S3,使用cordova-plugin-media-capture@1.4.3捕獲或使用cordova-plugin-camera@2.4.1從圖庫中拾取時,我遇到一個特殊的問題。 。 我正在使用JavaScript AWS SDK v2.3.11並調用SDK的.upload函數。

無論視頻文件的實際大小如何,它僅將15字節的數據復制到S3上,並且無法播放。

實施-

捕捉視頻:

navigator.device.capture.captureVideo(
  captureSuccess,
  captureError, 
  {
    limit: 1,
    duration: 30,
    destinationType: 2,
    sourceType: 1,
    mediaType: 1
  }
);
var captureSuccess = function (mediaFiles) {
  var mediaFile = mediaFiles[0];
  var filedata = {
    Key: "videos/" + fileName,
    ContentType: mediaFile.type,
    Body: mediaFile
  };
  var aws = AWS;
  var creds = new aws.Credentials(
                      AccessKeyId,
                      SecretAccessKey,
                      SessionToken
                  );
  aws.config.credentials = creds;
  s3 = new aws.S3();

  s3.upload(
    filedata, 
    {
      Bucket: bucketName
    }, 
    function(err, location){
      if(!err){
        //uploaded successfully
      } else {
        //upload failed
      }
    }
 );
}

當我嘗試將媒體文件轉換為其Base64數據並上傳時,它確實將完整的base64文件寫入S3存儲桶。 但是,然后我需要剝離前綴的文件類型和base64標識符文本,然后將數據反編譯為二進制格式,然后再次將其保存到S3(來自EB nodeJS服務)。 這種方法的另一個問題是,由於IOS和Android上的內存管理,將視頻文件轉換為base64數據並保存在手機的RAM內存中很容易導致應用程序崩潰。 我無法使用這種機制在Android中轉換超過5秒的視頻文件,而在16GB iPhone6中轉換超過10秒的視頻文件。 在這兩種情況下,應用程序都將崩潰。

更改的Base64實現:

var captureSuccess = function (mediaFiles) {
  var mediaFile = mediaFiles[0];
  var filedata = {
    Key: "videos/" + fileName,
    ContentType: mediaFile.type
  };
  var aws = AWS;
  var creds = new aws.Credentials(
                      AccessKeyId,
                      SecretAccessKey,
                      SessionToken
                  );
  aws.config.credentials = creds;
  s3 = new aws.S3();
  getBase64data(
    mediaFile.fullPath, //tried with mediaFile.localURL as well
    function(data){
      filedata.Body = data;
      s3.upload(
        filedata, 
        {
          Bucket: bucketName
        }, 
        function(err, location){
          if(!err){
            //uploaded successfully
          } else {
            //upload failed
          }
        }
      );  //ending s3.upload
    );  //ending getBase64data
}
function getBase64Data(filePath, cb){
  window.resolveLocalFileSystemURL(
    filePath,
    function(entry){
      entry.file(
        function(file) {
          var reader = new FileReader();
          reader.onloadend = function(event) {
            cb(event.target.result);
          };
          reader.readAsDataURL(file);
        }, 
        function(e){
         //error retrieving file object
        }
      ); //ending entry.file
    },
    function(e){
      //error getting entry object
    }
  ); //ending resolveLocalFileSystemURL
}

AWS S3 JavaScript SDK允許采用兩種不同的方式將文件數據提供給upload功能。 根據文檔,文件數據可以是以下任意一種:

Body — (Buffer, Typed Array, Blob, String, ReadableStream) Object data.

您需要先將捕獲的視頻中的數據提取為任何一種格式,然后再嘗試上傳。

使用mediaFile.fullPath ,您可以將文件中的數據讀入Buffer或創建ReadableStream,然后使用該文件上載文件。 要從文件中提取數據,可以使用cordova-plugin-file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM