Después de AVAssetExportSession, se ha completado la exportación de vídeo.
Tengo plan para el atuendo de Video Camino para subir a través de Youtube.
pero [GDataUtilities MIMETypeForFileAtPath:path defaultMIMEType:@"video/mp4"];
sólo se aceptan NSString.
Es posible convertir NSUrl en NSString para el vídeo de la ruta de archivo.

he intente utilizar NSString *path = [ExportoutputURL absoluteString];
pero crash.

Aquí está 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];
}

Error EXC_BAD_ACCESS en

NSString *path = [ExportoutputURL absoluteString];
  • Esto debería funcionar, tal vez liberado el NSURL antes? Podrías mostrar algo de código?
  • lo que está haciendo debería funcionar. por favor enviar más de código.
  • Es su NSURL instancia no nulo?.
  • tengo el código de actualización.
  • Compruebe si ExportoutputURL es nula. Si es la que, probablemente, la liberación está en algún lugar antes. Agregar [ExportoutputURL retain]; a la derecha después de iniciar y ver si todavía se bloquea. Si no, entonces usted es uno de los problema y debe cavar más profundo.
  • trate de relativePath en lugar de absoluteString
  • Así, si el envío de la NSURL objeto de un mensaje está causando un accidente, entonces no debe ser nil. Si se tratara de nil, no habría ningún accidente.
  • Estás asumiendo que ese es el lugar correcto para retenerla. Que no es una buena suposición. Sería mejor agregar una retener donde se necesita uno, si es necesario; si el problema es la excesiva liberación, la solución correcta es quitarlo.
  • Por qué relativePath y no path? La ruta de acceso relativa puede ser relativa a un lugar distinto del actual directorio de trabajo, en cuyo caso no será accesible. La ruta de acceso absoluta es accesible independientemente de que el directorio de trabajo.
  • Yo estaba ante la sospecha de que en realidad no es la NSURL instancia causando el problema.
  • No estoy asumiendo que este es el lugar correcto para conservar. He explícitamente escrito If not then that's your problem and you should dig little deeper., por lo que le insta a mirar más profundamente y encontrar el verdadero problema.

InformationsquelleAutor RAGOpoR | 2012-01-15

5 Comentarios

  1. 59

    Es posible convertir NSUrl en NSString para el vídeo de la ruta de archivo.

    Sí. Enviar un absoluteString mensaje.

    he intente utilizar NSString *path = [ExportoutputURL absoluteString]; pero crash.

    Si quieres una ruta de acceso, enviar la dirección URL de un path mensaje. Una cadena que representa una dirección URL no es generalmente una ruta de acceso válida; si quieres una ruta de acceso, preguntar por uno.

    Como para el choque, no significa absoluteString está mal. El envío de absoluteString a un NSURL objeto es la manera correcta para conseguir un NSString objeto que representa la dirección URL. El problema está en otro lugar.

    Error EXC_BAD_ACCESS en

    NSString *path = [ExportoutputURL absoluteString];

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

    Mi conjetura sería que el problema es este:

    ExportoutputURL = session.outputURL;

    De asignar la dirección URL a la ExportoutputURL variable de instancia, pero no retener el objeto o hacer su propia copia. Por lo tanto, usted no es dueño de este objeto, lo que significa que no se lo mantiene vivo. Se puede morir en cualquier momento, probablemente después de este método (exportDidFinish:) devuelve.

    El accidente se debe llamar uploadVideoFile más tarde, después de la URL del objeto ya ha muerto. Usted todavía tiene un puntero a ella, sino que el objeto ya no existe, por lo que el envío de un mensaje—cualquier mensaje—causas de un accidente.

    Hay tres soluciones simples:

    1. Retener el objeto URL cuando se asigna a su variable de instancia.
    2. Hacer su propia copia de la URL del objeto y asignarla a la variable de instancia.
    3. Declarar ExportoutputURL como una propiedad, ya sea con el strong palabra clave o el copy palabra clave, y asignar el objeto a la propiedad, no la variable de instancia. Que se llame a la propiedad de la incubadora, de que, si sintetizamos o implementar correctamente, conservarán o copia la dirección URL para usted.

    De cualquier manera, usted será el propietario del objeto, y que lo mantendrá vivo hasta que lo suelte. En consecuencia, es necesario liberar cuando haya terminado con él (en dealloc, si no antes), de manera que no escape de ella.

    Todo esto supone que no estás usando el ARCO. Si usted está usando Xcode 4.2 o posterior, y puede requerir iOS 4 o posterior, debe migrar el proyecto a ARCO, como hace tantas cosas mucho más simples. Usted no necesita retener o copia de este objeto si estaba usando el ARCO, lo que significa que la migración a ARCO ahora es un cuarto de la solución (pero sin duda una de mayor escala de uno).

    • Gracias por su información.
  2. 12

    Utilizar absolutePath o path como se ha mencionado por Miek y Nepster. La expansión de sus respuestas, la diferencia radica en el prefijo.

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

    Uso de este. Creo que va a ayudar a usted.

    En Objective c

    NSString *testString = testUrl.absoluteString;

    En Swift

    var testString : String = testUrl.absoluteString

Dejar respuesta

Please enter your comment!
Please enter your name here