我正在尝试通过资产库上传大小为 100MB 的视频。但是当我尝试使用-(NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error时,ALAssetRepresentation我得到内存已满错误。我还需要将缓冲区中的数据放到NSData. 我怎样才能做到这一点?
			
			2194 次
		
3 回答
            2        
        
		
我试过这样:
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];    
真的行!
于 2010-12-22T11:28:31.170   回答
    
    
            0        
        
		
正如@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];
我希望这会有所帮助!
于 2014-07-01T09:12:05.650   回答
    
    
            0        
        
		
需要添加 @autoreleasepool 块,以便清理任何自动出租的对象。看起来 ARC 在 iOS7 之后发生了一些变化
@autoreleasepool {
     NSUInteger readStatus = [rep getBytes:buffer fromOffset:_startFromByte length:chunkSize error:NULL];
}
    于 2015-06-15T04:48:32.587   回答