web-dev-qa-db-ja.com

NSUrlをNSStringに変換する方法は?

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];
34
RAGOpoR

ビデオファイルパス用にNSUrlをNSStringに変換することは可能ですか?.

はい。 absoluteStringメッセージを送信します。

nSString * path = [ExportoutputURL absoluteString];を使用しようとしました。しかし、クラッシュします。

パスが必要な場合は、URLにpathメッセージを送信します。通常、URLを表す文字列は有効なパスではありません。パスが必要な場合は、パスを尋ねます。

クラッシュに関しては、absoluteStringが間違っているという意味ではありません。 NSURLオブジェクトにabsoluteStringを送信することは、URLを表すNSStringオブジェクトを取得する正しい方法です。問題はどこかにあります。

エラーEXC_BAD_ACCESS

NSString *path = [ExportoutputURL absoluteString];

これはおそらく、ExportoutputURLnilではなく、有効なオブジェクトでもないものを指していることを意味します。ある時点でNSURLオブジェクトを指していたかもしれませんが、現在はそうではありません。

私の推測では、問題はこれだと思います:

ExportoutputURL = session.outputURL;

URLをExportoutputURLインスタンス変数に割り当てますが、オブジェクトを保持したり、独自のコピーを作成したりしません。したがって、あなたはこのオブジェクトを所有していません。つまり、このオブジェクトを存続させているわけではありません。いつでも死ぬ可能性があり、おそらくこの方法の後で死にます(exportDidFinish:) 戻り値。

クラッシュの原因は、URLオブジェクトがすでに消滅した後に、後でuploadVideoFileを呼び出すためです。あなたはまだそれへのポインタを持っていますが、そのオブジェクトはもはや存在しないので、それにメッセージを送信すること-any message-はクラッシュを引き起こします。

3つの簡単なソリューションがあります。

  1. インスタンス変数に割り当てるときに、URLオブジェクトを保持します。
  2. URLオブジェクトの独自のコピーを作成し、それをインスタンス変数に割り当てます。
  3. ExportoutputURLキーワードまたはstrongキーワードのいずれかを使用して、copyをプロパティとして宣言し、オブジェクトをプロパティに割り当てますnotインスタンス変数。これにより、プロパティのセッターが呼び出されます。このセッターは、プロパティを合成または正しく実装すると、URLを保持またはコピーします。

いずれにせよ、あなたはオブジェクトを所有します、そしてそれはあなたがそれを解放するまで生き続けます。したがって、リークが発生しないように、(完了していない場合はdeallocで)完了したらリリースする必要があります。

これはすべて、ARCを使用していないことを前提としています。 Xcode 4.2以降を使用していて、iOS 4以降が必要な場合は、プロジェクトをARCに移行する必要があります。これにより、非常に多くのことが簡単になります。 ARCを使用している場合、このオブジェクトを保持またはコピーする必要はありません。つまり、ARCへの移行は4番目のソリューションです(ただし、大規模なソリューションであることは確かです)。

59
Peter Hosey

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"`
12
nishanths
NSString *path = [[NSString alloc] initWithString:[url path]];  ?
11
Miek

簡単にこのようにできます。

NSString *myString = [myURL absoluteString];
0
Xar E Ahmer

これを使って。役立つと思います。

Objective Cで

NSString *testString = testUrl.absoluteString;

スイフトで

var testString : String = testUrl.absoluteString
0
Atanu Mondal