Попытка получить байты и добавить с помощью NSMutableData для видео через библиотеку активов дает ошибку переполнения памяти - PullRequest
0 голосов
/ 25 сентября 2010

Я пытаюсь загрузить видео размером 100 МБ через библиотеку активов. Но когда я пытаюсь использовать -(NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error из ALAssetRepresentation, я получаю ошибку переполнения памяти. Мне также нужно поместить данные в буфер до NSData. Как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2010

Я пробовал так:

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

Это действительно работает!

0 голосов
/ 15 июня 2015

необходимо добавить блок @autoreleasepool, чтобы все очищенные объекты были очищены. похоже, что у ARC что-то изменилось после iOS7

@autoreleasepool {
     NSUInteger readStatus = [rep getBytes:buffer fromOffset:_startFromByte length:chunkSize error:NULL];
}
0 голосов
/ 01 июля 2014

Как сказал @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];

Надеюсь, это поможет!

...