7

次のコードを使用してMPMoviePlayerControllerを使用してビデオを再生していますが、ビデオが再生されません。誰か教えてもらえますか?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/one.mp4"];

NSString *mediaPath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:filePath];

    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:mediaPath]];

    [[moviePlayer view] setFrame:[[self view] bounds]];
    [[self view] addSubview: [moviePlayer view]];


    moviePlayer.scalingMode = MPMovieScalingModeAspectFit;

    [moviePlayer play];
4

7 に答える 7

20

かなり奇妙ですが、MPMoviePlayerControllerをローカル変数ではなくプロパティにすると問題なく動作するようです。舞台裏で何かが起こっているようです。ARCに関係していると思います。ARCを使用していますか?

また、パスを過剰に追加したことも問題です。

// You've already got the full path to the documents directory here.
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/one.mp4"];
// Now you're appending the full path to the documents directory to your bundle path
NSString *mediaPath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:filePath];

シミュレーターでコードを実行すると、パスは次のようになります。

/Users/mlong/Library/Application Support / iPhone Simulator / 5.1 / Applications / 8CFB9B94-BD6A-442C-A525-573FE343506D / VidoePlayer.app / Users / mlong / Library / Application Support / iPhone Simulator / 5.1 / Applications / 8CFB9B94-BD6A -442C-A525-573FE343506D / Documents / one.mp4

これだけである必要があります:

/Users/mlong/Library/Application Support / iPhone Simulator / 5.1 / Applications / 8CFB9B94-BD6A-442C-A525-573FE343506D / Documents / one.mp4

したがって、この行を削除するだけです。

NSString *mediaPath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:filePath];

次に、プレーヤーのインスタンス化を次のように変更します。

_moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:filePath]];

[[_moviePlayer view] setFrame:[[self view] bounds]];
[[self view] addSubview: [_moviePlayer view]];

_moviePlayer.scalingMode = MPMovieScalingModeAspectFit;

[_moviePlayer play];

したがって、MPMoviePlayerControllerを、含まれているViewControllerのプロパティとして追加する必要があります。

于 2012-06-08T18:13:09.673 に答える
3

さて、アプリバンドルとドキュメントディレクトリには大きな違いがあります。それを見てみることをお勧めします。

まず、ビデオはどこに保存されますか?

ビデオがドキュメントディレクトリにある場合は、ドキュメントディレクトリパスをバンドルパスに追加しないでください。

filePath変数を試してみてください:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"/one.mp4"];

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL filePath]];

ただし、ファイルがアプリバンドルに含まれている場合(XCodeでプロジェクトに追加した場合)、jinx応答にあるものを使用する必要があります。

于 2012-05-30T10:54:22.153 に答える
1
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];  
        [moviePlayer.view setFrame:CGRectMake(//set rect frame)];
        moviePlayer.controlStyle =  MPMovieControlStyleDefault; 
        moviePlayer.shouldAutoplay=YES;
        moviePlayer.repeatMode = NO;  
        [moviePlayer setFullscreen:YES animated:NO]; 
        [moviePlayer prepareToPlay];
[self.view addsubview:movieplayer.view];

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerLoadStateDidChange:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];


- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification {

    if ((moviePlayer.loadState & MPMovieLoadStatePlaythroughOK) == MPMovieLoadStatePlaythroughOK) {
//add your code


    }
}
于 2012-09-03T09:34:59.460 に答える
0

ファイルパスを手動で設定するのではなく、バンドルに直接問い合わせてみてください

NSString *path = [[NSBundle mainBundle] pathForResource:@"name" ofType:@"mov"];
于 2012-05-30T10:24:45.073 に答える
0

プレーヤーは、現在のビューのサブビューとして追加された後、再生するビデオのURL(デバイスのローカルファイルのパスまたはライブURLのいずれか)で初期化されます。

MPMoviePlayerControllerクラスでサポートされているビデオフォーマットは次のとおりです

  1. .mov .mpv .3gp .mp4

この記事がどれだけ役立つかわかりません。私はこれに不慣れです。私はこの記事で提供されているステップバイステップの説明に取り組みました

于 2014-02-19T07:43:17.147 に答える
-1
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:mediaPath]];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];

助けてください

于 2012-05-30T10:38:20.910 に答える
-1

問題をデバッグするのに数分かかりましたが、答えは非常に簡単です。取引は次のとおりです。

  • MPMoviePlayerViewControllerをWebURLから再生する場合は、次を使用します。NSURL * url = [NSURL URLWithString:@ " https://www.test.com/anyMovie.mp4 "];

  • また、MPMoviePlayerViewControllerでApp Bundleから再生する場合は、次を使用します。NSString * moviePath = [[NSBundle mainBundle] pathForResource:@ "anyMovie" ofType:@ "m4v"]; NSURL * url = [NSURL fileURLWithPath:moviePath];

このプロパティ「movieSourceType」を次のように設定する必要があることを除いて、残りの部分は同じです。

MPMoviePlayerViewController *moviePlayerView = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
moviePlayerView.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[self presentViewController:moviePlayerView animated:YES completion:^{}];
于 2013-06-03T09:24:17.223 に答える