开发者

Trying to get bytes and append using NSMutableData for a video through Asset Library gives memory full error

开发者 https://www.devze.com 2023-01-17 08:22 出处:网络
I’m trying to upload a vid开发者_如何学编程eo of size 100MB through Asset Library. But when i try to use -(NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length

I’m trying to upload a vid开发者_如何学编程eo of size 100MB through Asset Library. But when i try to use -(NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error of ALAssetRepresentation I get memory full error. I also need to put the data in buffer to NSData. How can i achieve that?


I tried this way:

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

It really works!


As @runeb said the answer is not working properly with large files. You should do something like that:

            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);
            }

In order to append data to a file you can use that:

NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
    [myHandle seekToEndOfFile];
    [myHandle writeData:videoData];

I hope that helps!


ust add @autoreleasepool block, so that any autorleased objects should be cleaned up. it looks like that ARC has something changed after iOS7

@autoreleasepool {
     NSUInteger readStatus = [rep getBytes:buffer fromOffset:_startFromByte length:chunkSize error:NULL];
}
0

精彩评论

暂无评论...
验证码 换一张
取 消