AVAssetExportSession
がビデオのエクスポートを完了した後。 YouTube経由でアップロードするビデオパスを取得する予定です。ただし、[GDataUtilities MIMETypeForFileAtPath:path defaultMIMEType:@"video/mp4"];
はNSString
のみを受け入れます。 NSUrlをビデオファイルパスのNSStringに変換することは可能ですか?.
NSString *path = [ExportoutputURL absoluteString];
を使用しようとしましたが、クラッシュします。
ここにコードがあります
- (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
NSString *path = [ExportoutputURL absoluteString];
ビデオファイルパス用にNSUrlをNSStringに変換することは可能ですか?.
はい。 absoluteString
メッセージを送信します。
nSString * path = [ExportoutputURL absoluteString];を使用しようとしました。しかし、クラッシュします。
パスが必要な場合は、URLにpath
メッセージを送信します。通常、URLを表す文字列は有効なパスではありません。パスが必要な場合は、パスを尋ねます。
クラッシュに関しては、absoluteString
が間違っているという意味ではありません。 NSURLオブジェクトにabsoluteString
を送信することは、URLを表すNSStringオブジェクトを取得する正しい方法です。問題はどこかにあります。
エラーEXC_BAD_ACCESS
NSString *path = [ExportoutputURL absoluteString];
これはおそらく、ExportoutputURL
がnil
ではなく、有効なオブジェクトでもないものを指していることを意味します。ある時点でNSURLオブジェクトを指していたかもしれませんが、現在はそうではありません。
私の推測では、問題はこれだと思います:
ExportoutputURL = session.outputURL;
URLをExportoutputURL
インスタンス変数に割り当てますが、オブジェクトを保持したり、独自のコピーを作成したりしません。したがって、あなたはこのオブジェクトを所有していません。つまり、このオブジェクトを存続させているわけではありません。いつでも死ぬ可能性があり、おそらくこの方法の後で死にます(exportDidFinish:
) 戻り値。
クラッシュの原因は、URLオブジェクトがすでに消滅した後に、後でuploadVideoFile
を呼び出すためです。あなたはまだそれへのポインタを持っていますが、そのオブジェクトはもはや存在しないので、それにメッセージを送信すること-any message-はクラッシュを引き起こします。
3つの簡単なソリューションがあります。
ExportoutputURL
キーワードまたはstrong
キーワードのいずれかを使用して、copy
をプロパティとして宣言し、オブジェクトをプロパティに割り当てますnotインスタンス変数。これにより、プロパティのセッターが呼び出されます。このセッターは、プロパティを合成または正しく実装すると、URLを保持またはコピーします。いずれにせよ、あなたはオブジェクトを所有します、そしてそれはあなたがそれを解放するまで生き続けます。したがって、リークが発生しないように、(完了していない場合はdealloc
で)完了したらリリースする必要があります。
これはすべて、ARCを使用していないことを前提としています。 Xcode 4.2以降を使用していて、iOS 4以降が必要な場合は、プロジェクトをARCに移行する必要があります。これにより、非常に多くのことが簡単になります。 ARCを使用している場合、このオブジェクトを保持またはコピーする必要はありません。つまり、ARCへの移行は4番目のソリューションです(ただし、大規模なソリューションであることは確かです)。
MiekおよびNepsterで説明されているように、absolutePath
またはpath
を使用します。回答を拡大すると、違いは接頭辞にあります。
NSString* string1 = [url absoluteString]; // @"file:///Users/jackbrown/Music/song name.mp3"
NSString* string2 = [url path]; // @"/Users/jackbrown/Music/song name.mp3"`
NSString *path = [[NSString alloc] initWithString:[url path]]; ?
簡単にこのようにできます。
NSString *myString = [myURL absoluteString];
これを使って。役立つと思います。
Objective Cで
NSString *testString = testUrl.absoluteString;
スイフトで
var testString : String = testUrl.absoluteString