我无法从ALAsset
获取的网址中检索NSData以下是我尝试过的代码: - 我总是将NSData视为零。
NSData *webData = [NSData dataWithContentsOfURL:[asset defaultRepresentation].url];
我也试过这样的事情
NSData *webData1 = [NSData dataWithContentsOfURL:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]]];
我从ALAsset获得的网址: -
?资产库://asset/asset.MOV ID = 1000000116&安培; EXT = MOV
我已经尝试过以下链接,但是我需要不必要地写入一个非常耗时的临时位置。
任何正确方向的提示都将受到高度赞赏。
等待你的回复
答案 0 :(得分:61)
试试这段代码: -
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc((NSUInteger)rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:(NSUInteger)rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
答案 1 :(得分:17)
字节缓冲区=(字节)malloc(rep.size);如果rep.size是如此之大,可能是300M,那将会崩溃。所以试试这段代码:
+ (BOOL)writeDataToPath:(NSString*)filePath andAsset:(ALAsset*)asset
{
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:filePath];
if (!handle) {
return NO;
}
static const NSUInteger BufferSize = 1024*1024;
ALAssetRepresentation *rep = [asset defaultRepresentation];
uint8_t *buffer = calloc(BufferSize, sizeof(*buffer));
NSUInteger offset = 0, bytesRead = 0;
do {
@try {
bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:nil];
[handle writeData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]];
offset += bytesRead;
} @catch (NSException *exception) {
free(buffer);
return NO;
}
} while (bytesRead > 0);
free(buffer);
return YES;
}