从ALAsset URL获取视频的NSData(iOS)

14

我无法从ALAsset获取的URL中检索NSData。

以下是我尝试的代码:我始终将NSData获取为空值。

 NSData *webData = [NSData dataWithContentsOfURL:[asset defaultRepresentation].url];

我也尝试过这样做

 NSData *webData1 = [NSData dataWithContentsOfURL:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]]];

我从ALAsset获取的URL是:

assets-library://asset/asset.MOV?id=1000000116&ext=MOV

我尝试了下面这个链接,它可以工作,但我需要将视频写入一个临时位置,这样非常耗时。

从ALAsset获取视频

如果有任何指向正确方向的提示,将不胜感激。

期待您的回复。

2个回答

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];

2
如果视频不在ALAssetLibrary中,即它是由应用程序生成或使用UIImagePickerController导入并保存在文档区域中,怎么办?有没有一种方法可以在不涉及ASAssetLibrary框架的情况下完成这个任务? - eddy
我收到了这个错误信息:“尝试访问<ALAssetPrivate: 0x16ea2530>,但其所属的ALAssetsLibrary已经失效。” - Salman Khakwani
如何在Swift中使用它 - Hamza Ansari
@Leena 嗨,Leena,你能给我一些参考链接或教程吗?我想在 iOS 9.0 中使用 Photos 框架来完成这种操作。 - Mubin Mall
1
@TheMall 请参考此链接 https://dev59.com/uIPba4cB1Zd3GeqPyujd - Leena
显示剩余5条评论

17

如果rep.size非常大,例如300M,使用malloc可能会导致程序崩溃。建议尝试以下代码:

std::vector<Byte> buffer(rep.size);

+ (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;
}

谢谢。但是我怎么在这里添加元数据值呢?我真的需要写入它们。 - Alexandru Dranca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接