2012-01-09 4 views
14

Я не смог получить NSData из URL, который я получаю от ALAssetПолучить видео NSData из ALAsset URL IOS

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

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

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

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

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

активы библиотека: //asset/asset.MOV ID = 1000000116 & ext = MOV

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

Getting video from ALAsset

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

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

ответ

60

попробовать этот код: -

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

благодаря его работал :) Я надеюсь, что так как вы г с помощью dataWithBytesNoCopy: freeWhenDone: нам не нужно, чтобы освободить «буфер» в явном виде? – Ekra

+1

это не создаст проблем. – Leena

+1

Работает отлично ....... leeeeena .... :) – Rajneesh071

17

Байт буфера = (Byte) таНос (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; 
} 
+0

Спасибо. Но как я могу добавить значения метаданных здесь? Мне действительно нужно их написать. –

Смежные вопросы