2012-01-15 10 views
31

Después de AVAssetExportSession tiene video de exportación completo. Tengo planeado crear Video Path para cargar a través de Youtube. pero [GDataUtilities MIMETypeForFileAtPath:path defaultMIMEType:@"video/mp4"]; solo acepta NSString. Es posible convertir NSUrl en NSString para la ruta del archivo de video.Cómo convertir NSUrl a NSString?

intenté utilizar NSString *path = [ExportoutputURL absoluteString]; pero se cuelga.

Este es el código

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

} 

EXC_BAD_ACCESS error en

NSString *path = [ExportoutputURL absoluteString]; 
+1

Esto debería funcionar, tal vez haya lanzado el NSURL anteriormente? ¿Podrías mostrar algún código? – MByD

+1

lo que está haciendo debería funcionar. por favor publique más código. – madmik3

+0

¿Su instancia de NSURL no es nula? –

Respuesta

58

¿Es posible convertir en NSURL a NSString para la ruta del archivo de vídeo.

Sí. Envíele un mensaje de absoluteString.

intenté usar NSString * path = [ExportoutputURL absoluteString]; pero se cuelga.

Si desea una ruta, envíe un mensaje de correo electrónico a la dirección URL path. Una cadena que representa una URL generalmente no es una ruta válida; si quieres un camino, pídelo.

En cuanto a la falla, no significa que absoluteString es incorrecto. Enviar absoluteString a un objeto NSURL es la forma correcta de obtener un objeto NSString que represente la URL. El problema está en otro lado.

EXC_BAD_ACCESS error en

NSString *path = [ExportoutputURL absoluteString]; 

Esto probablemente significa que ExportoutputURL puntos a algo que no es nil pero tampoco es un objeto válido. Podría haber apuntado a un objeto NSURL en algún momento, pero ahora no.

Mi conjetura sería que el problema es el siguiente:

ExportoutputURL = session.outputURL; 

asigna la dirección URL a la variable ExportoutputURL ejemplo, pero no retienen el objeto o hacer su propia copia. Por lo tanto, no posee este objeto, lo que significa que no lo mantiene vivo. Puede morir en cualquier momento, muy probablemente después de que regrese este método (exportDidFinish:).

El bloqueo se debe a que llama al uploadVideoFile más tarde, después de que el objeto URL ya ha muerto. Aún tiene un puntero, pero ese objeto ya no existe, por lo que enviar un mensaje a él cualquier mensaje provoca un bloqueo.

Hay tres soluciones simples:

  1. retener el objeto URL cuando se asigna a la variable de instancia.
  2. Haga su propia copia del objeto URL y asígnelo a la variable de instancia.
  3. Declarar ExportoutputURL como una propiedad, ya sea con la palabra clave o la palabra clave strongcopy, y asignar el objeto a la propiedad, no la variable de instancia. Eso llamará al colocador de la propiedad, que, si lo sintetiza o implementa correctamente, retendrá o copiará la URL por usted.

De cualquier forma, poseerá el objeto y lo mantendrá con vida hasta que lo suelte. En consecuencia, deberá liberarlo cuando haya terminado con él (en dealloc, si no antes), para que no lo filtre.

Todo esto supone que no está utilizando ARC. Si está utilizando Xcode 4.2 o posterior, y puede requerir iOS 4 o posterior, debe migrar su proyecto a ARC, ya que hace que muchas cosas sean mucho más simples. No necesitaría retener o copiar este objeto si estuviera usando ARC, lo que significa que migrar a ARC ahora es una cuarta solución (pero ciertamente una de mayor escala).

+0

Gracias por su información. – RAGOpoR

11
NSString *path = [[NSString alloc] initWithString:[url path]]; ? 
0

Simplemente puede hacerlo así.

NSString *myString = [myURL absoluteString]; 
10

uso ya sea absolutePath o path como se ha mencionado por Miek y Nepster. Ampliando en sus respuestas, la diferencia entre mentiras en el prefijo.

NSString* string1 = [url absoluteString]; // @"file:///Users/jackbrown/Music/song name.mp3" 
NSString* string2 = [url path]; // @"/Users/jackbrown/Music/song name.mp3"`