Получить видео NSData от ALAsset URL iOS - PullRequest
14 голосов
/ 09 января 2012

Я не могу получить NSData из URL-адреса, полученного от ALAsset

Ниже приведен код, который я пробовал: - Я всегда получаю NSData как ноль.

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

Я такжепробовал что-то вроде этого

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

URL-адрес, который я получаю от ALAsset: -

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

Я попробовал эту ссылку ниже, которая работает, но мне нужно ненужную запись во временную папку, которая занимает очень много времени.

Получение видео от ALAsset

Любая подсказкав правильном направлении будет высоко ценится.

Жду ваших ответов

Ответы [ 2 ]

61 голосов
/ 10 января 2012

попробуйте этот код: -

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];
17 голосов
/ 17 июля 2013

Байт буфер = (Байт ) 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;
}
...