0

我正在尝试通过资产库上传大小为 100MB 的视频。但是当我尝试使用-(NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error时,ALAssetRepresentation我得到内存已满错误。我还需要将缓冲区中的数据放到NSData. 我怎样才能做到这一点?

4

3 回答 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 回答