3

無限にループするビデオクリップを再生しようとしています。私はこれをAppleが推奨する方法で行っています。AVPlayerItemDidPlayToEndTimeNotificationによってトリガーされる通知を設定することによって:

@property(nonatomic) AVPlayer *videoPlayer;
@property(nonatomic) AVPlayerItem *videoPlayerItem;

-(void)loadVideo
{
    NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:extension];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    NSString *tracksKey = @"tracks";

    [asset loadValuesAsynchronouslyForKeys:@[tracksKey] completionHandler:
    ^{
        dispatch_async(dispatch_get_main_queue(),
        ^{
            NSError *error;
            AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];

            if (status == AVKeyValueStatusLoaded)
            {
                [self setVideoPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];
                [videoPlayerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext];
                [[NSNotificationCenter defaultCenter] addObserver:self
                                                         selector:@selector (videoPlayerItemDidReachEnd:)
                                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                                           object:videoPlayerItem];
                [self setVideoPlayer:[AVPlayer playerWithPlayerItem:videoPlayerItem]];
                [scenePlayerView setVideoPlayer:videoPlayer];
            }
        });
    }];
}

トリガーされると、これは私のメソッドを呼び出して、クリップを効果的に巻き戻して再度再生します。

-(void)videoPlayerItemDidReachEnd:(NSNotification *)notification
{
    [videoPlayerItem seekToTime:kCMTimeZero];
    [videoPlayer play];
}

問題は、このメソッドにヒットして最初にループバックするたびに、ビデオ再生に短いが目に見える一時停止があることです。

ビデオクリップはH.264であり、コンテンツに目に見える「スキップ」がないことを確認するために他のプレーヤーでテストされています。これはすべて、シミュレーターとiPad2およびiPad3の両方のiOS6で発生しています。

私は何が間違っているのですか?

4

3 に答える 3

2

不具合のない本当にプロフェッショナルなループを作成するには、2 つの方法があります (AVPlayer だけでは機能しません)。まず、元のビデオを取得して、一連の RGB フレーム (画像) にデコードできます。次に、新しい h.264 ビデオをエンコードし、フレームを最初のビデオよりもはるかに長い h.264 ビデオにフィードします。たとえば、10 秒間のループ クリップを 6 回エンコードして 1 分間続くクリップを作成したり、6 * 5 をエンコードしてループが再開したときにグリッチなしで 5 分間再生されるクリップを作成したりできます。次に、長いクリップを開いて AVPlayer で再生すると、しばらくの間グリッチが発生しなくなります。

2 番目のアプローチは、シームレスなループを既に処理している既存のライブラリを使用することです。私のライブラリを見て、基本的に同じ質問iphone-smooth-transition-from-one-video-to-anotherに対する私の答えを見てください。リンクされた回答の例のキャラクターは、ボタンが押されていないときに何度もループする1つのビデオクリップの繰り返し「ループ」を使用しています。

于 2013-06-18T01:08:39.033 に答える
1

残念ながら、現状の AVPlayer を使用してこれを実際に行うことは実際には不可能であるようです。AVPlayer で再生を開始すると、どのような場合でも避けられない問題が発生します。そのため、複数の AVPlayer などを使用して、これを解決する唯一の方法は「厄介な」ハックのようです。

于 2012-11-23T04:51:23.753 に答える