35 votes

Comment convertir NSUrl en NSString?

Après que AVAssetExportSession a terminé l'exportation de la vidéo. J'ai l'intention de mettre le chemin vidéo à télécharger via Youtube. mais [GDataUtilities MIMETypeForFileAtPath:path defaultMIMEType:@"video/mp4"]; il n'accepte que NSString . Est-il possible de convertir NSUrl en NSString pour le chemin du fichier vidéo.

j'ai essayé d'utiliser NSString *path = [ExportoutputURL absoluteString]; mais ça plante.

Voici le code

 - (void)exportDidFinish:(AVAssetExportSession*)session {
    ExportoutputURL = session.outputURL;

    _exporting = NO;
    NSIndexPath *exportCellIndexPath = [NSIndexPath indexPathForRow:2 inSection:kProjectSection];
    ExportCell *cell = (ExportCell*)[self.tableView cellForRowAtIndexPath:exportCellIndexPath];
    cell.progressView.progress = 1.0;
    [cell setProgressViewHidden:YES animated:YES];
    [self updateCell:cell forRowAtIndexPath:exportCellIndexPath];

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:ExportoutputURL]) {
        [library writeVideoAtPathToSavedPhotosAlbum:ExportoutputURL
                                    completionBlock:^(NSURL *assetURL, NSError *error){
                                        dispatch_async(dispatch_get_main_queue(), ^{
                                            if (error) {
                                                NSLog(@"writeVideoToAssestsLibrary failed: %@", error);
                                                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
                                                                                                    message:[error localizedRecoverySuggestion]
                                                                                                   delegate:nil
                                                                                          cancelButtonTitle:@"OK"
                                                                                          otherButtonTitles:nil];
                                                [alertView show];
                                                [alertView release];
                                            }
                                            else {
                                                _showSavedVideoToAssestsLibrary = YES;
                                                ExportCell *cell = (ExportCell*)[self.tableView cellForRowAtIndexPath:exportCellIndexPath];
                                                [cell setDetailTextLabelHidden:NO animated:YES];
                                                [self updateCell:cell forRowAtIndexPath:exportCellIndexPath];
                                                NSArray *modes = [[[NSArray alloc] initWithObjects:NSDefaultRunLoopMode, UITrackingRunLoopMode, nil] autorelease];
                                                [self performSelector:@selector(hideCameraRollText) withObject:nil afterDelay:5.0 inModes:modes];
                                            }
                                        });

                                    }];
    }
    [library release];
}

- (void)uploadVideoFile {

    NSString *devKey = DEVELOPER_KEY;

    GDataServiceGoogleYouTube *service = [self youTubeService];
    [service setYouTubeDeveloperKey:devKey];

    NSURL *url = [GDataServiceGoogleYouTube youTubeUploadURLForUserID:kGDataServiceDefaultUser];

    // load the file data
    NSString *path = [ExportoutputURL absoluteString];//[[NSBundle mainBundle] pathForResource:@"video_2451" ofType:@"mp4"];//[mFilePathField stringValue];
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
    NSString *filename = [path lastPathComponent];

    // gather all the metadata needed for the mediaGroup
    NSString *titleStr = @"Upload Test";//[mTitleField stringValue];
    GDataMediaTitle *title = [GDataMediaTitle textConstructWithString:titleStr];

    NSString *categoryStr = @"Entertainment";//[[mCategoryPopup selectedItem] representedObject];
    GDataMediaCategory *category = [GDataMediaCategory mediaCategoryWithString:categoryStr];
    [category setScheme:kGDataSchemeYouTubeCategory];

    NSString *descStr = @"GData Description";//[mDescriptionField stringValue];
    GDataMediaDescription *desc = [GDataMediaDescription textConstructWithString:descStr];

    NSString *keywordsStr = @"RAGOpoR Demo";//[mKeywordsField stringValue];
    GDataMediaKeywords *keywords = [GDataMediaKeywords keywordsWithString:keywordsStr];

    BOOL isPrivate = NO;//([mPrivateCheckbox state] == NSOnState);

    GDataYouTubeMediaGroup *mediaGroup = [GDataYouTubeMediaGroup mediaGroup];
    [mediaGroup setMediaTitle:title];
    [mediaGroup setMediaDescription:desc];
    [mediaGroup addMediaCategory:category];
    [mediaGroup setMediaKeywords:keywords];
    [mediaGroup setIsPrivate:isPrivate];

    NSString *mimeType = [GDataUtilities MIMETypeForFileAtPath:path
                                               defaultMIMEType:@"video/mp4"];

    // create the upload entry with the mediaGroup and the file
    GDataEntryYouTubeUpload *entry;
    entry = [GDataEntryYouTubeUpload uploadEntryWithMediaGroup:mediaGroup
                                                    fileHandle:fileHandle
                                                      MIMEType:mimeType
                                                          slug:filename];

    SEL progressSel = @selector(ticket:hasDeliveredByteCount:ofTotalByteCount:);
    [service setServiceUploadProgressSelector:progressSel];

    GDataServiceTicket *ticket;
    ticket = [service fetchEntryByInsertingEntry:entry
                                      forFeedURL:url
                                        delegate:self
                               didFinishSelector:@selector(uploadTicket:finishedWithEntry:error:)];
    [self setUploadTicket:ticket];
    GTMHTTPUploadFetcher *uploadFetcher = (GTMHTTPUploadFetcher *)[ticket objectFetcher];

}
 

Erreur EXC_BAD_ACCESS à

 NSString *path = [ExportoutputURL absoluteString];
 

59voto

Peter Hosey Points 66275

Est-il possible de convertir NSUrl à NSString pour la vidéo chemin d'accès au fichier.

Oui. Envoyer un absoluteString message.

j'ai essayer d'utiliser NSString *chemin = [ExportoutputURL absoluteString]; mais il crash.

Si vous souhaitez un chemin, envoyer l'URL d'un path message. Une chaîne de caractères représentant une URL est généralement pas un chemin d'accès valide; si vous voulez un chemin d'accès, demandez-lui pour un.

Comme pour le crash, il ne signifie pas absoluteString est faux. L'envoi d' absoluteString pour un NSURL objet est la bonne manière d'obtenir un NSString objet qui représente l'URL. Le problème est ailleurs.

Erreur EXC_BAD_ACCESS à

NSString *path = [ExportoutputURL absoluteString];

Cela signifie probablement que d' ExportoutputURL de points à quelque chose qui n'est pas nil mais aussi, n'est pas un objet valide. Il aurait indiqué à un NSURL objet à un certain point, mais il n'est pas maintenant.

J'imagine que le problème est le suivant:

ExportoutputURL = session.outputURL;

Vous affectez l'URL de l' ExportoutputURL variable d'instance, mais vous n'avez pas de conserver l'objet ou de faire votre propre copie. Par conséquent, vous ne possédez pas cet objet, ce qui signifie que vous n'êtes pas le maintenir en vie. Il peut mourir à tout moment, probablement après cette méthode (exportDidFinish:) les rendements.

Le crash est parce que vous vous appelez uploadVideoFile plus tard, après l'URL l'objet est déjà mort. Vous avez encore un pointeur, mais cet objet n'existe plus, donc l'envoi d'un message-tout message provoque un blocage.

Il y a trois solutions:

  1. Conserver l'objet d'URL lorsque vous affectez à votre variable d'instance.
  2. Faire votre propre copie de l'URL de l'objet et de l'assigner à la variable d'instance.
  3. Déclarer ExportoutputURL comme une propriété, soit à l' strong mot-clé ou l' copy mot-clé, et affecter l'objet de la propriété, pas la variable d'instance. Qui va appeler la propriété du setter, qui, si vous en faire la synthèse, ou de la mettre en œuvre correctement, permet de conserver ou de copier l'URL pour vous.

De toute façon, vous serez propriétaire de l'objet, et qui sera le garder en vie jusqu'à la libération. En conséquence, vous aurez besoin de libérer lorsque vous avez fini avec elle (en dealloc, si pas plus tôt), de sorte que vous n'avez pas une fuite, il.

Tout cela suppose que vous n'êtes pas à l'aide de l'ARC. Si vous êtes en utilisant Xcode 4.2 ou une version ultérieure, et peut exiger iOS 4 ou une version ultérieure, vous devez migrer votre projet à l'ARC, car il permet beaucoup de choses beaucoup plus simple. Vous n'auriez pas besoin de conserver ou de copie de cet objet si vous utilisez un ARC, ce qui signifie que la migration à l'ARC est maintenant une quatrième solution (mais certainement une plus grande échelle).

11voto

Miek Points 437
NSString *path = [[NSString alloc] initWithString:[url path]];  ?

0voto

Nepster Points 893

Vous pouvez simplement le faire comme ça.

 NSString *myString = [myURL absoluteString];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X