1

HTTPライブストリーミングを使用してビデオを再生するiOS4.0-5.1用のアプリがあります。タップするとストリームの再生を開始するビューのボタンを使用した簡単なセットアップがあります。これはiOS5では正常に機能しますが、iOS 4でストリームの再生を開始する前に、ボタンを2回タップする必要があります。これが発生する理由と、ボタンを最初にタップしたときにビデオを再生する方法を知っている人はいますか?

これが私がしていることです:

.h

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>

@interface ViewController : UIViewController{
    MPMoviePlayerController *moviePlayer;
}

@property (nonatomic, strong) MPMoviePlayerController *moviePlayer;

-(IBAction)playApple:(id)sender;

@end

.m

-(IBAction)playApple:(id)sender{
    if(self.moviePlayer){
        self.moviePlayer = nil;
    }

    //Use Apple's sample stream
    NSURL *mediaURL = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
    self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaURL];

    //Begin observing the moviePlayer's load state.
    [[NSNotificationCenter defaultCenter] addObserver:self 
           selector:@selector(moviePlayerLoadStateChanged:) 
           name:MPMoviePlayerLoadStateDidChangeNotification 
           object:self.moviePlayer];

    [self.moviePlayer setMovieSourceType:MPMovieSourceTypeStreaming];
    [self.moviePlayer setShouldAutoplay:NO];//Stop it from autoplaying
    [self.moviePlayer prepareToPlay];//Start preparing the video
}

#pragma mark Notification Center
- (void)moviePlayerLoadStateChanged:(NSNotification *)notification{
    NSLog(@"State changed to: %d\n", moviePlayer.loadState);
    if(self.moviePlayer.loadState == MPMovieLoadStatePlayable){
        //if load state is ready to play
        [self.view addSubview:[self.moviePlayer view]];
        [self.moviePlayer setFullscreen:YES];
        [self.moviePlayer play];//play the video
    }

}
4

1 に答える 1

5

私はいくつかの考えられる問題を見ることができます-それを試してみて、これのいずれかまたはすべてがうまくいったかどうかを私たちに知らせてください。

1.ロードステートマスキング

は直接比較するのloadstateではなく、複数の状態が混在している可能性があるため、比較する前にマスクする必要があります。

MPMovieLoadState

ムービープレーヤーのネットワーク負荷状態を表す定数。

enum {
   MPMovieLoadStateUnknown        = 0,
   MPMovieLoadStatePlayable       = 1 << 0,
   MPMovieLoadStatePlaythroughOK  = 1 << 1,
   MPMovieLoadStateStalled        = 1 << 2,
};
typedef NSInteger MPMovieLoadState;

したがって、直接比較するのではなく、安全を期すためにマスクしてください。

2.ビューの設定

再生を開始する直前にプレーヤービューを設定してみませんか。私はあなたのやり方でそれを見たことがありません(これが問題であると私が確信していたわけではありません-それでも、私には奇妙に思えます)。さらに、プレーヤーが割り当てているビューを実際に使用しない場合でも(フルスクリーンモードでは少し異なります)、適切なフレームを割り当ててビュー設定を強化することをお勧めします。

上記のすべてが、この新しいバージョンのコードに組み込まれました...

-(IBAction)playApple:(id)sender
{
    if(self.moviePlayer)
    {
        self.moviePlayer = nil;
    }

    //Use Apple's sample stream
    NSURL *mediaURL = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
    self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaURL];

    //Begin observing the moviePlayer's load state.
    [[NSNotificationCenter defaultCenter] addObserver:self 
           selector:@selector(moviePlayerLoadStateChanged:) 
           name:MPMoviePlayerLoadStateDidChangeNotification 
           object:self.moviePlayer];

    self.moviePlayer.view.frame = self.view.bounds;
    [self.view addSubview:[self.moviePlayer view]];
    [self.moviePlayer setFullscreen:YES];
    [self.moviePlayer setMovieSourceType:MPMovieSourceTypeStreaming];
    [self.moviePlayer setShouldAutoplay:NO];   //Stop it from autoplaying
    [self.moviePlayer prepareToPlay];          //Start preparing the video
}

- (void)moviePlayerLoadStateChanged:(NSNotification *)notification
{
    NSLog(@"State changed to: %d\n", moviePlayer.loadState);
    if((self.moviePlayer.loadState & MPMovieLoadStatePlayable) == MPMovieLoadStatePlayable)
    {
        //if load state is ready to play
        [self.moviePlayer play];//play the video
    }
}
于 2012-08-20T18:05:10.437 に答える