0

这是我的代码,应该播放嵌入在子视图中的视频,但它只显示没有控件的静止图像。

- (void)displayVideo:(NSURL *)videoURL
{
    if (self.mediaPlayer) {
        [self.mediaPlayer.view removeFromSuperview];
        self.mediaPlayer = nil;
    }

    self.mediaPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL];
    [self.mediaPlayer.moviePlayer prepareToPlay];
    self.mediaPlayer.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
    self.mediaPlayer.view.frame = CGRectMake(0, 0, self.mediaView.bounds.size.width, self.mediaView.bounds.size.height);
    [self.mediaView addSubview:self.mediaPlayer.view];
    [self.mediaPlayer.moviePlayer play];
}

我还尝试直接在 mediaPlayer 是 MPMoviePlayerController 而不是 MPMoviePlayerViewController 的地方加载媒体播放器,但只有黑色视图我得到的更少。

    self.mediaPlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
    [self.mediaPlayer prepareToPlay];
    self.mediaPlayer.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
    self.mediaPlayer.view.frame = CGRectMake(0, 0, self.mediaView.bounds.size.width, self.mediaView.bounds.size.height);
    [self.mediaView addSubview:self.mediaPlayer.view];
    [self.mediaPlayer play];

谢谢你的帮助。

4

3 回答 3

1

第一个代码是完全错误的。使用 MPMoviePlayerViewController 的唯一方法是作为呈现的视图控制器 ( presentViewController:...);你不能抓住它的视图并试图把它塞进你自己的界面。

第二个机会要大得多。所以这里有一些事情需要考虑:

  • videoURL有效吗?你怎么知道的?不,认真的。还要考虑格式,因为并非每种视频格式都可以在 iOS 下播放。

  • 是否self.mediaPlayer保留电影播放器​​控制器?再次,仔细看;这很关键。它必须有strongorretain策略。

  • 您的界面中是否还有其他媒体播放器控制器视图?我注意到在第二个代码中您忘记删除前一个代码。这很关键!这样的观点只能有一种。

(顺便说一句,没有必要要求MPMovieControlStyleEmbedded;这是此配置中的默认值。)

最后,与工作代码进行比较可能会有所帮助。我书中的代码确实有效:

http://www.aeth.com/iOSBook/ch28.html#_mpmovieplayercontroller

NSURL* m = [[NSBundle mainBundle] URLForResource:@"ElMirage"
                                   withExtension:@"mp4"];
MPMoviePlayerController* mp =
    [[MPMoviePlayerController alloc] initWithContentURL:m];
self.mpc = mp; // retain policy
self.mpc.shouldAutoplay = NO;
[self.mpc prepareToPlay];
self.mpc.view.frame = CGRectMake(10, 10, 300, 250);
self.mpc.backgroundView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.mpc.view];

你可以通过下载这个例子来证明:

https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ch28p786moviePlayer

于 2013-05-10T02:34:12.713 回答
0

首先检查你的videoURL是否有效?iOS 中的视频技术支持播放具有 .mov、.mp4、.m4v 和 .3gp 文件扩展名并使用以下压缩标准的电影文件:

1) H.264 视频,最高 1.5 Mbps,640 x 480 像素,每秒 30 帧,H.264 基线配置文件的低复杂度版本,具有最高 160 Kbps 的 AAC-LC 音频,48 kHz,立体声音频。 m4v、.mp4 和 .mov 文件格式

2) H.264 视频,最高 768 Kbps,320 x 240 像素,每秒 30 帧,Baseline Profile 最高 1.3 级,AAC-LC 音频最高 160 Kbps,48 kHz,.m4v,.mp4 格式的立体声音频,和 .mov 文件格式

3) MPEG-4 视频,最高 2.5 Mbps,640 x 480 像素,每秒 30 帧,具有最高 160 Kbps、48 kHz 的 AAC-LC 音频的简单配置文件,.m4v、.mp4 和 .mov 文件中的立体声音频格式

 -(void) viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];

     player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:strSelectedVideoUrl]];
     player.scalingMode = MPMovieScalingModeAspectFit;
     player.movieSourceType = MPMovieSourceTypeFile;
       player.view.frame = CGRectMake(0, 45, 320, 400);
       player.shouldAutoplay = YES;
     [player prepareToPlay];
     [self.view addSubview:player.view];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:player];

     [player play];
 }
 - (void) movieFinishedCallback:(NSNotification*) aNotification {
     MPMoviePlayerController *player1 = [aNotification object];
     [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player1];
     [player stop];
     [player1.view removeFromSuperview];
     //[player1 release];
     player1 = nil;
     [self.navigationController popViewControllerAnimated:YES];
 }
于 2013-05-10T05:28:13.703 回答
0

试试这个,它对我来说非常有用

NSURL *movieURL = [NSURL URLWithString:@"http://........"];

// Initialize a movie player object with the specified URL

 self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];

self.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;


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

    [self.view addSubview:self.moviePlayer.view];

    [self.moviePlayer play];
于 2013-05-10T11:31:28.877 回答