我该如何改进我的视频上传,目前由于内存不足导致应用程序崩溃

How can I improve my video upload currently crashes the app from out of memory usage

我目前正在从我的应用程序 (android) 上传视频,这会导致应用程序崩溃,试图弄清楚如何使其在应用程序和服务器端的两端都高效...在一天结束时,它确实上传了视频,但应用程序或服务器崩溃,具体取决于哪个内存不足。

堆栈 - Java、改造、Node.js、诺克斯、heroku、amazonS3

对于客户端android:(改造,java):

其余文件:

@Multipart
        @POST("/addMedia")
        public void addMedia(
                @Part("name") String name,
                @Part("categ") String category,
                @Part("desc") String desc,
                @Part("creatorId") String creatorId,
                @Part("isItAPicture") String isItAPicture, //if true it is a picture
                @Part("mediaFile") TypedFile mediaFile,
                Callback<UserResponse> callback);

创建Class 文件:

  ApiManager.getAsyncApi().addMedia(title, categ, descr, creatorId, String.valueOf(isPictureNotvideo), media, new Callback<UserResponse>() {
            @Override
            public void success(UserResponse userResponse, Response response) {
             \
            }

            @Override
            public void failure(RetrofitError error) {
throw error;
            }
        });

服务器端(Node.js、heroku、AmazonS3、knox 模块)

var s3 = knox.createClient({
    key: config.amazonS3.key,
    secret: config.amazonS3.secret,
    bucket:config.amazonS3.bucketMedia
});






function setupAndCreateMedia ( cb) {
    if(req.files && req.files.mediaFile) {
        console.log("Received file:\n" + JSON.stringify(req.files));
        //add p for pics will do v for vids
        videoID = "v" + path.basename(req.files.mediaFile.path);
        tmp_path = req.files.mediaFile.path;
        targetPathSmall = './public/img/media/' + videoID;
        videoConvert = req.files.mediaFile.name;
        var video = req.files.mediaFile;
        var s3Headers = {
            'Content-Type': video.type,
            'x-amz-acl': 'public-read'
        };
        //console.log('stdout:', stdout, targetPathSmall)
        s3.putStream(targetPathSmall, videoID, s3Headers, function(err, s3response){
        //handle, respond
            if(err) { 
                console.log(err);
            } else {
                console.log("saved to S3");
                //console.log(s3response);
                cb(null, videoID);
            }
        });
    } else {
        videoID = "";
        cb(null, videoID);
    }
}

这是 android 上的崩溃消息:

Caused by: java.lang.OutOfMemoryError: Failed to allocate a 48298892 byte allocation with 16777216 free bytes and 44MB until OOM

问题可能是由日志记录引起的。 Retrofit 的记录器读取您的视频二进制文件,并在此处引发 OOM 异常。

为防止它,请使用以下方法禁用您的 restAdapter 的日志:

setLogLevel(LogLevel.NONE)

Source