1

私は解決策を求めてインターネットを歩き回っていますが、何が間違っているのか本当にわかりません。私はこの問題を数日抱えています。アプリケーションがアクセスできるはずの次のパスにビデオを保存します(右?)

//NSDocumentDirectory doesn't work either.
NSArray *newPath = NSSearchPathForDirectoriesInDomains(NSMoviesDirectory,
                                                       NSUserDomainMask, YES);
NSString *moviesDirectory = [NSString stringWithFormat:@"%@/WebSurg", 
                                                     [newPath objectAtIndex:0]];
// Check if the directory already exists
if (![[NSFileManager defaultManager] fileExistsAtPath:moviesDirectory]) {
    // Directory does not exist so create it
    [[NSFileManager defaultManager] createDirectoryAtPath:moviesDirectory 
                      withIntermediateDirectories:YES attributes:nil error:nil];
}

このディレクトリの内容をアプリケーションのtableViewに表示します。行をタップすると、ビデオが再生されます。しかし、そうではありません。MPMoviePlayerViewControllerモーダルビューが表示され、おそらく1秒後に非表示になります。これは私がそれを再生するために使用するコードです:私は無駄への道を取得する2つの方法を試しました。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSArray *moviesPath = NSSearchPathForDirectoriesInDomains(NSMoviesDirectory, 
                                                              NSUserDomainMask, YES);
    NSString *moviesDirectory = [NSString stringWithFormat:@"%@/WebSurg", 
                                                       [moviesPath objectAtIndex:0]];
    NSString *movie = [self.tableData objectAtIndex:indexPath.row];
    NSString *moviePath = [NSString stringWithFormat:@"%@/%@", 
                                                         moviesDirectory, movie];
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath]; 
    NSLog(@"MOVIEPATH: %@", moviePath);

    NSString *alternatePath = [NSString stringWithFormat:@"%@/%@", 
                                            [[NSBundle mainBundle] resourcePath], movie];
    NSURL *alternateMoviePath = [NSURL fileURLWithPath:moviePath];
    movieViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:alternateMoviePath];
    movieViewController.moviePlayer.movieSourceType= MPMovieSourceTypeFile;
    NSLog(@"Movie Load State: %d", [[movieViewController moviePlayer] loadState]);
    NSLog(@"Alternate movie Path: %@", alternatePath);
    [self presentMoviePlayerViewControllerAnimated:movieViewController];
    [movieViewController.moviePlayer play];
    [self checkAndPlay];
}

- (void) checkAndPlay {
    if ([[self.movieViewController moviePlayer] loadState] == MPMovieLoadStateUnknown) { 
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:
                               @selector(checkAndPlay) userInfo:nil repeats:NO];
    } else {
        [self.movieViewController setModalTransitionStyle:
                                   UIModalTransitionStyleCrossDissolve];
        [self presentModalViewController:movieViewController animated:YES];
    }
}

そして、これらはコンソールの結果です:

2012-10-08 10:14:52.392 WebsurgTemplates[3722:17903] MOVIEPATH: /Users/THISISME/Library/Application Support/iPhone Simulator/5.0/Applications/E075DBE3-BFEA-4F6A-9DFA-2CC912E14863/Movies/WebSurg/FirstVideo.mp4
2012-10-08 10:14:52.459 WebsurgTemplates[3722:17903] Movie Load State: 0
2012-10-08 10:14:52.460 WebsurgTemplates[3722:17903] Alternate movie Path: /Users/THISISME/Library/Application Support/iPhone Simulator/5.0/Applications/E075DBE3-BFEA-4F6A-9DFA-2CC912E14863/WebsurgTemplates.app/FirstVideo.mp4

何か提案や助けをいただければ幸いです!!

アップデート

私は今のところ進歩していません。私はなんとか他のデータをコンソールに記録することができました。この問題を解決するのに役立つかもしれないいくつかの情報です。ビデオを再生するためのリンクとしてビデオの直接ダウンロードを使用して空白のプロジェクトを作成しようとしましたが、機能しませんでした。何が起こるかはまったく同じです。jaydee3は、おそらくNSMoviesDirectoryにアクセスできなかったためだと言っていました。そこでNSDocumentDirectoryに変更しましたが、問題は解決しませんでした。ファイルが存在することと、プレーヤーが読み取れるように保存されている形式を確認しました。それでも動作しません。何が間違っているのかわかりません。提案/ヘルプを再度ありがとう。

ここにデバッグの結果があります。より完全な:

if ([[NSFileManager defaultManager] fileExistsAtPath:moviePath]) {
    NSLog(@"FILE EXISTS");
    CFStringRef fileExtension = (__bridge CFStringRef) [moviePath pathExtension];
    CFStringRef fileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, NULL);

    if (UTTypeConformsTo(fileUTI, kUTTypeImage)) NSLog(@"It's an image");
    else if (UTTypeConformsTo(fileUTI, kUTTypeMovie)) NSLog(@"It's a movie");
    else if (UTTypeConformsTo(fileUTI, kUTTypeText)) NSLog(@"It's text");
}

RESULTS
[6343:17903] MOVIEPATH: /Users/myname/Library/Application Support/iPhone Simulator/5.0/Applications/E075DBE3-BFEA-4F6A-9DFA-2CC912E14863/Documents/FirstVideo.mp4
[6343:17903] FILE EXISTS
[6343:17903] It's a movie
4

1 に答える 1

1

さて、問題を解決して犯人を見つけることができました。

簡単に言うと、ダウンロードしたムービーが適切に保存されていなかったことが原因でした (原因については現在調査中です)。このため、プレーヤーは、存在するファイルを再生しようとしましたが、正しい形式と正しい名前でしたが、それは空でした。ダウンロード、転送、再生後にすべてのファイルサイズを記録することで、これを見つけました。

より説明的な問題は、ムービーを にダウンロードしてNSCachesDirectoryから に保存していたことNSDocumentDirectoryです。これを見つけたのは、本当にファイルが見つかったのか、ファイルが「食べられる」のか疑問に思ったからです。に直接ダウンロードすると、映画が正常に再生されるようになりましたNSDocumentDirectory。ここで、接続が切断された場合に備えて解決する必要があります。NSCachesDirectory自動的にそれを解決して保存します。私はそれに関する提案を受け入れています。NSCachesDirectoryからにデータを転送するために機能しなかったコードは次のNSDocumentDirectoryとおりです。

NSArray *paths = NSSearchPathForDirectoriesInDomains
                // HERE I changed NSCachesDirectory to NSDocumentDirectory fixed it
                            (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *cachesDirectory = [paths objectAtIndex:0];
NSString *downloadPath = [cachesDirectory stringByAppendingPathComponent:
                                                  @"DownloadedVideo.mp4"];
NSArray *newPath = NSSearchPathForDirectoriesInDomains
                                  (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *moviesDirectory = [NSString stringWithFormat:@"%@", 
                                                [newPath objectAtIndex:0]];
self.downloadOperation = [ApplicationDelegate.mainDownloader downloadVideoFrom:
                                    @"http://www.blablabla.web/iphone/download.php"                                    
                                            toFile:downloadPath]; 
于 2012-10-09T14:20:39.403 に答える