我正在尝试通过资产库上传大小为 100MB 的视频。但是当我尝试使用-(NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error
时,ALAssetRepresentation
我得到内存已满错误。我还需要将缓冲区中的数据放到NSData
. 我怎样才能做到这一点?
问问题
2194 次
3 回答
2
我试过这样:
Byte *buffer = (Byte*)malloc(asset.defaultRepresentation.size);
NSUInteger k = [asset.defaultRepresentation getBytes:buffer fromOffset: 0.0
length:asset.defaultRepresentation.size error:nil];
NSData *adata = NSData *adata = [NSData dataWithBytesNoCopy:buffer
length:j freeWhenDone:YES];
真的行!
于 2010-12-22T11:28:31.170 回答
0
正如@runeb 所说,答案不适用于大文件。你应该这样做:
int bufferSize = 2048;
int offset = 0;
NSString* name=nil;
while(offset<asset.size){
Byte *buffer = (Byte*)malloc(bufferSize);
NSUInteger buffered = [asset getBytes:buffer fromOffset:offset length:bufferSize error:nil];
NSData *data;
data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:NO];
if(!name){
//Creates the file and gives it a unique name
name = [FileUtils saveVideoFromAsset:data];
}
else{
//Append data to the file created...
[FileUtils appendData:data toFile:name];
}
offset+=buffered;
free(buffer);
}
为了将数据附加到文件中,您可以使用它:
NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
[myHandle seekToEndOfFile];
[myHandle writeData:videoData];
我希望这会有所帮助!
于 2014-07-01T09:12:05.650 回答
0
需要添加 @autoreleasepool 块,以便清理任何自动出租的对象。看起来 ARC 在 iOS7 之后发生了一些变化
@autoreleasepool {
NSUInteger readStatus = [rep getBytes:buffer fromOffset:_startFromByte length:chunkSize error:NULL];
}
于 2015-06-15T04:48:32.587 回答