Google рд╕реНрдЯреНрд░реАрдЯ рд╡реНрдпреВ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рд╣рд╛рдЗрдкрд░рд▓реИрдк / рдЯрд╛рдЗрдо-рд▓реИрдкреНрд╕ рд╡реАрдбрд┐рдпреЛ рдереАрдо рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЧрдИ рдереАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреБрдЦреНрдпрд╛рдд рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж http://hyperlapse.tllabs.io/



рдЕрд╡рд╕рд░ рд╕реНрд╡рдпрдВ, рдмреЗрд╢рдХ, рдЕрджреНрднреБрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдЗрдЯ рдЖрдкрдХреЛ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдЗрд╕ рдХрд╖реНрдЯрдкреНрд░рдж рдЙрдкрджреНрд░рд╡ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рди рдХреЗрд╡рд▓ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ рдЖрдИрдУрдПрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдИрдлреЛрди рдпрд╛ рдЖрдИрдкреИрдб рдХреЛ рдмрдирд╛рдиреЗ, рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ, рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реАред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рддреЛ, рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдЯреНрд░реАрдЯ рд╡реАрдбрд┐рдпреЛ рд╢реВрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╣рд╛рдЗрдкрд░рд▓реЗрдкреНрд╕ рд╣реИред рдЯреЗрд▓реЗрдмрд╕рд┐рдпреЛ , рдЬреЛ рдЖрдкрдХреЛ 2 рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ, рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдорд╛рд░реНрдЧ рдмрдирд╛рдиреЗ рдФрд░ рд▓реВрдк рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЖрдирдВрдж рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЫрд╡рд┐

рджреВрд╕рд░реА рд╕рд╛рдЗрдЯ рдЬреЛ рдЖрдкрдХреЛ рд╕рдбрд╝рдХ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рд╡рд╣ рд╣реИ http://track-kit.net

рдЫрд╡рд┐

рдпрд╣ рд╕рд╛рдЗрдЯ рдЖрдкрдХреЛ рдмрдирд╛рдП рдЧрдП рдпрд╛ рдЖрдпрд╛рддрд┐рдд рдЯреНрд░реИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕реНрдЯреНрд░реАрдЯ рд╡реАрдбрд┐рдпреЛ рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рдЖрдк рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:

http://track-kit.net/maps_s3/index.php?track=8821.gpx&svv=134

рд╕рдЪ рд╣реИ, рдореЗрд░реЗ рдореИрдХ рдкрд░ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХреЗрд╡рд▓ рдХреНрд░реЛрдо рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдВрд╕рд╛рдзрди рдЖрдкрдХреЛ рд╡реАрдбрд┐рдпреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЕрдм рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред

рд╡реАрдбрд┐рдпреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  1. рдмрд┐рдВрджреБ A рд╕реЗ рдмрд┐рдВрджреБ B рддрдХ рджрд┐рд╢рд╛-рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред Google рд╕реНрдЯреНрд░реАрдЯ рд╡реНрдпреВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред
  2. рдкреИрдиреЛрд░рдорд╛ рдлреНрд░реЗрдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
  3. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреИрдиреЛрд░рдорд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХреИрдорд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд░рдХреЗред
  4. рдлрд╝реНрд░реЗрдо рд╡реАрдбрд┐рдпреЛ рдмрдирд╛рдПрдВ
  5. рдЖрдИрдУрдПрд╕ рдХреА рдХрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдВред




рджрд┐рд╢рд╛-рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо iOS рдХреЗ рд▓рд┐рдП Google рдореИрдкреНрд╕ SDK рдФрд░ Google рджрд┐рд╢рд╛ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

Google рджрд┐рд╢рд╛ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо Google рд╕реЗ рдПрдиреНрдХреЛрдбреЗрдб рдлрд╝реЙрд░реНрдо рдореЗрдВ рдкрде рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдЕрдВрдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдХрдИ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред

IOS рдФрд░ GMSPath рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП Google рдореИрдкреНрд╕ SDK рдХреЛ рдЕрдХреНрд╖рд╛рдВрд╢ рдФрд░ рджреЗрд╢рд╛рдВрддрд░ рдореЗрдВ Google рдХреЛ рдкреНрд░рд╛рдкреНрдд рдЕрдВрдХреЛрдВ рдХреА рдПрдиреНрдХреЛрдбреЗрдб рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

Google рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, AFNetworking рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

static NSString *kLWSDirectionsURL = @"http://maps.googleapis.com/maps/api/directions/json?"; - (void)loadDirectionsForWaypoints:(NSArray *)waypoints{ NSString *origin = [waypoints objectAtIndex:0]; int waypointCount = [waypoints count]; int destinationPos = waypointCount -1; NSString *destination = [waypoints objectAtIndex:destinationPos]; NSString *sensor = @"false"; NSMutableString *url = [NSMutableString stringWithFormat:@"%@&origin=%@&destination=%@&sensor=%@", kLWSDirectionsURL,origin,destination, sensor]; if(waypointCount>2) { [url appendString:@"&waypoints=optimize:true"]; int wpCount = waypointCount-2; for(int i=1;i<wpCount;i++){ [url appendString: @"|"]; [url appendString:[waypoints objectAtIndex:i]]; } } url = [NSMutableString stringWithString:[url stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding]]; _directionsURL = [NSURL URLWithString:url]; [self startDownloadDataForURL:_directionsURL]; } AFHTTPRequestOperation *requestOperation; NSMutableArray* coordinatesArr; -(void)startDownloadDataForURL:(NSURL*)url{ [self stopLoadingForUserInfo:userInfo]; requestOperation = [manager GET:[url absoluteString] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString* status = [responseObject objectForKey:@"status"]; NSArray* routesArr = [responseObject objectForKey:@"routes"]; if ([status isEqualToString:@"OK"] && [routesArr count] > 0) { NSDictionary *routes = [responseObject objectForKey:@"routes"][0]; NSDictionary *route = [routes objectForKey:@"overview_polyline"]; NSString *overview_route = [route objectForKey:@"points"]; GMSPath *path = [GMSPath pathFromEncodedPath:overview_route]; coordinatesArr = [NSMutableArray array]; for (int i = 0; i < [path count]; ++i) { CLLocationCoordinate2D coord = [path coordinateAtIndex:i]; [coordinatesArr addObject:[NSValue valueWithMKCoordinate:coord]]; } } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; }
      
      





рдпрджрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реВрдЪреА рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдкрде рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕реЗрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред

PS Google рджрд┐рд╢рд╛ API рдореЗрдВ 1 рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ - рдпрджрд┐ рдЖрдкрдХреЛ 2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рд░реНрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, 20 рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдкрдХреЛ рд░рд╛рд╕реНрддреЗ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк "рдФрд░ waypoints" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдордзреНрдпрд╡рд░реНрддреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Google рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред



рдкреИрдиреЛрд░рдорд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ


рдПрдХ рдкреИрдиреЛрд░рдорд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдлреЙрд░реНрдо cbk0.google.com/cbk?output=json&ll=latitude , рджреЗрд╢рд╛рдВрддрд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдпрд╣ рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЕрдХреНрд╖рд╛рдВрд╢, рджреЗрд╢рд╛рдВрддрд░ рдХреЗ рд╕рд╛рде рдмрд┐рдВрджреБ рдХреЗ рдирд┐рдХрдЯрддрдо рдкреИрдиреЛрд░рдорд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧрд╛ред

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬ рдЬреЛ рд╣рдо рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ "рдкреИрдиреЛрдЗрдж" - рдкреИрдиреЛрд░рдорд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдкреИрдиреЛрдЖрдИрдбреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдкреИрдиреЛрд░рдорд╛ рдХреЗ рдСрдлрд╕реЗрдЯ рдХреЛрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ рдкреИрдиреЛрд░рдорд╛ рдХреЛ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ):

 NSString* panoID; -(void)loadMyWebViewForCoord:(CLLocationCoordinate2D)arg{ @try { if (!manager) { manager = [AFHTTPRequestOperationManager manager]; } NSString* urlStr = [NSString stringWithFormat:@"http://cbk0.google.com/cbk?output=json&ll=%f,%f",arg.latitude,arg.longitude]; request = [manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { id location = [responseObject objectForKey:@"Location"]; id projection = [responseObject objectForKey:@"Projection"]; if (location && projection) { panoID = [location objectForKey:@┬лpanoId┬╗]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; }
      
      





рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рд╛рдкреНрдд рдкреИрдиреЛрд░рдорд╛ рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

cbk0.google.com/cbk?output=tile&panoid=panoid&zoom=zoom&x=x&y=y

рдкреИрдиреЛрд░рдорд╛ рдЯрд╛рдЗрд▓реНрд╕ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдкреИрдирдУрдЖрдИрдбреА рдкреИрдиреЛрд░рдорд╛ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╝реВрдо рдкреИрдиреЛрд░рдорд╛ рд╕реНрдХреЗрд▓ (рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░) рд╣реИ, x рдФрд░ y рдкреИрдиреЛрд░рдорд╛ рдЯрд╛рдЗрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛рдПрдБ рд▓рдВрдмрд╡рдд рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдкреИрдиреЛрд░рдорд╛ рдЯрд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЬрд╝реВрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЬрд╝реВрдо = 3 рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдкреИрдиреЛрд░рдорд╛ рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ 7 рдФрд░ рдКрдБрдЪрд╛рдИ рдореЗрдВ 3 рдЯрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреАред

рдпрд╣реА рд╣реИ, рдкреВрд░реЗ рдкреИрдиреЛрд░рдорд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рднреА рдЯрд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 -(void)loadImagesForPanoPoint:(PanoPoint*)currentPanoPointArg { @try { int zoom; int maxX; int maxY; if ([StreetViewSettings instance].hiQualityPano) { zoom = 3; maxX = 7; maxY = 3; } else { zoom = 2; maxX = 4; maxY = 2; } __block int allImages = maxX; for (int x = 0; x < maxX; ++x) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSMutableArray* imForCurrentCoodY = [NSMutableArray array]; for (int y = 0; y < maxY; ++y) { @autoreleasepool { NSString* pathStr = [NSString stringWithFormat:@"http://cbk0.google.com/cbk?output=tile&panoid=%@&zoom=%d&x=%d&y=%d",currentPanoPointArg.panoID,zoom,x,y]; NSString* tempDirectory = NSTemporaryDirectory(); NSString* imPath = [NSString stringWithFormat:@"%@/panoLoadCash/%@zoom=%dx=%dy=%d_%d",tempDirectory,currentPanoPointArg.panoID,zoom,x,y,currentCoordArrIndex]; NSData* im = nil; NSFileManager* fM = [NSFileManager defaultManager]; BOOL isD; if (![fM fileExistsAtPath:imPath isDirectory:&isD]) { im = [self imgByPath:pathStr]; } else { [imForCurrentCoodY addObject:imPath]; } if (im) { pakSize += im.length; if (![fM fileExistsAtPath:[NSTemporaryDirectory() stringByAppendingString:@"panoLoadCash"] isDirectory:&isD]) { NSError* err; [fM createDirectoryAtPath:[NSTemporaryDirectory() stringByAppendingString:@"panoLoadCash"] withIntermediateDirectories:YES attributes:[NSDictionary dictionary] error:&err]; } [im writeToFile:imPath atomically:YES]; [imForCurrentCoodY addObject:imPath]; } } } [imForCurrentCoordV addObject:@(x)]; [imForCurrentCoordTemp addObject:imForCurrentCoodY]; --allImages; }); } }
      
      





рдЗрд╕ рдкреНрд░рдХрд╛рд░, Google рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рд░реНрдЧ рдХреЗ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдкреИрдиреЛрд░рдорд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рд╣рдо рд╡реАрдбрд┐рдпреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ AVFoundation рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 #import <AVFoundation/AVFoundation.h>
      
      





рд╡рд╣рд╛рдБ рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ 3 рдХрдХреНрд╖рд╛рдПрдВ рд▓реЗрддреЗ рд╣реИрдВ:

AVAssetWriter - рдлрд╛рдЗрд▓ рдореЗрдВ рдореАрдбрд┐рдпрд╛ рдбреЗрдЯрд╛ рд▓рд┐рдЦреЗрдВ

AVAssetWriterInput - AVAssetWriter рдореЗрдВ рдлрд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореАрдбрд┐рдпрд╛ рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

AVAssetWriterInputPixelBufferAdaptor - AVAssetWriterInput рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реАрдбрд┐рдпреЛ рдкреИрдХреЗрдЬ (CVPixelBuffer) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

рддрджрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╣реАрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  AVAssetWriter* videoWriter; AVAssetWriterInput* writerInput; AVAssetWriterInputPixelBufferAdaptor* adaptor;
      
      





рдЖрдЧреЗ рдХреА рд╢реБрд░реВрдЖрдд:

 NSError *error = nil; videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:videoPath] fileType:AVFileTypeQuickTimeMovie error:&error]; NSDictionary *videoSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecH264, AVVideoCodecKey, [NSNumber numberWithInt:videoSize.width], AVVideoWidthKey, [NSNumber numberWithInt:videoSize.height], AVVideoHeightKey, nil]; writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings]; adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput sourcePixelBufferAttributes:nil]; [videoWriter addInput:writerInput]; [videoWriter startWriting]; [videoWriter startSessionAtSourceTime:kCMTimeZero]
      
      





рдЙрд╕рдХреЗ рдмрд╛рдж, рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред

AVAssetWriterInput рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ:

(рд╢реВрдиреНрдп) рдЕрдиреБрд░реЛрдзMediaDataWhenReadyOnQueue: (dispatch_queue_t) рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд┐рд▓: (рд╢реВрдиреНрдп (^) (рд╢реВрдиреНрдп)) рдмреНрд▓реЙрдХ

рдЬреЛ рд╣рд░ рдмрд╛рд░ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдирдпрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдмреНрд▓реЙрдХ рдХрд╣рддреЗ рд╣реИрдВред

 [writerInput requestMediaDataWhenReadyOnQueue:assetWriterQueue usingBlock:^ if (buffer == NULL) { CVPixelBufferPoolCreatePixelBuffer (NULL, adaptor.pixelBufferPool, &buffer); } UIImage *image = [self imageForIndex:currentIndexForBuff]; if (image) { buffer = [self pixelBufferFromCGImage:image.CGImage]; CMTime presentationTime= CMTimeMakeWithSeconds(speed*currentIndexForBuff, 33); if (![adaptor appendPixelBuffer:buffer withPresentationTime:presentationTime]) { [self finishVideo]; return; } CVPixelBufferRelease(buffer); if (currentIndexForBuff < imagesPathsForVideo.count) { } else { [self finishVideo]; } } else { if (currentIndexForBuff < imagesPathsForVideo.count) { } else { [self finishVideo]; } return; } ++currentIndexForBuff; }];
      
      





рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдмреИрдХ рдЧрддрд┐ рдХреЛ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд╝реНрд░реЗрдо рд╕рдордп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ

UIImage * рдЫрд╡рд┐ рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рд╣реИ

рдЬрдм рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рд╕рднреА рдлрд╝реНрд░реЗрдо рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡реАрдбрд┐рдпреЛрд╡рд┐рдЯрд░ рдФрд░ рд░рд╛рдЗрдЯрд░рдЗрдиреНрдкреБрдЯ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рдмрдВрдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 -(void)finishVideo { [writerInput markAsFinished]; [videoWriter finishWritingWithCompletionHandler:^(){}]; }
      
      





рдЫрд╡рд┐ рд╕реЗ CVPixelBufferRef рдкрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп:

 - (CVPixelBufferRef) pixelBufferFromCGImage: (CGImageRef) image { if (image) { NSDictionary *options = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil]; CVPixelBufferRef pxbuffer = NULL; CVPixelBufferCreate(kCFAllocatorDefault, CGImageGetWidth(image), CGImageGetHeight(image), kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, &pxbuffer); CVPixelBufferLockBaseAddress(pxbuffer, 0); void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pxdata, CGImageGetWidth(image), CGImageGetHeight(image), 8, 4*CGImageGetWidth(image), rgbColorSpace, kCGImageAlphaNoneSkipFirst); CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image); CGColorSpaceRelease(rgbColorSpace); CGContextRelease(context); CVPixelBufferUnlockBaseAddress(pxbuffer, 0); return pxbuffer; } else { return nil; } }
      
      







рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВ


рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рд╡реАрдбрд┐рдпреЛ рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЯрд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдЕрдЪреНрдЫреА рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ

https://github.com/vaskravchuk/VideoMaker/



рдереЛрдбрд╝рд╛ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдкрд░, рд╣рдореЗрдВ рдРрд╕рд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рдж рдорд┐рд▓рддрд╛ рд╣реИред

itunes.apple.com/us/app/street-video-maker-free-create/id788610126?mt=8

рдЫрд╡рд┐

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:



рд╕рдбрд╝рдХ рдХреЗ рд╡реАрдбрд┐рдпреЛ рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ 360 ┬░ Langstrasse рд╕рд╛рдЗрдЯ рдХрд╛ рдЕрдВрдд рдерд╛ред рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдмрд╛рдХреА рд╕рд┐рд░реНрдл рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╣реИ:



рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рднреМрдЧреЛрд▓рд┐рдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред рдордЬрд╛ рдЖ рдЧрдпрд╛ред рдЕрдВрдд рдореЗрдВ, рдЧрдирдерд░ рд╡реЗрдЧрдирд░ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢реЗрд╡рд░ рд╕рдордп-рдЪреВрдХ рдХрд╛ рдПрдХ рд╕рд╛




All Articles