我该如何改进我的视频上传,目前由于内存不足导致应用程序崩溃
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)
我目前正在从我的应用程序 (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)