0

診断できないメモリ リークがあります。シームレスにループするビデオを作成するために複数のアプローチを試しました - AVPlayerLooper 以外に、私が遭遇して試したすべてのアプローチには、監視するオブザーバーを作成しAVPlayerItemDidPlayToEndTimeNotification、ビデオの先頭 (AVPlayer の場合) をシークするか、挿入することが含まれます。ビデオ キューにループされるビデオ (AVQueuePlayer の場合)。どちらも同様のパフォーマンスを持っているように見えますが、seekToTime メソッド (AVPlayer の場合) と insertItem メソッド (AVQueuePlayer の場合) に関連するメモリ保持も一貫しています。私の最終目標は、デフォルトでループする SKVideoNode のサブクラスを作成することです。以下は、サブクラスの私のコードです。

#import "SDLoopingVideoNode.h"
#import <AVFoundation/AVFoundation.h>


@interface SDLoopingVideoNode()
@property AVQueuePlayer *avQueuePlayer;
@property AVPlayerLooper *playerLooper;
@end

@implementation SDLoopingVideoNode

-(instancetype)initWithPathToResource:(NSString *)path withFiletype:(NSString *)filetype
{
if(self == [super init])
{
    NSString *resourcePath = [[NSBundle mainBundle] pathForResource:path ofType:filetype];
    NSURL *videoURL = [NSURL fileURLWithPath:resourcePath];
    AVAsset *videoAsset = [AVAsset assetWithURL:videoURL];
    AVPlayerItem * videoItem  = [AVPlayerItem playerItemWithAsset:videoAsset];


    self.avQueuePlayer = [[AVQueuePlayer alloc] initWithItems:@[videoItem]];

    NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
    [noteCenter addObserverForName:AVPlayerItemDidPlayToEndTimeNotification
                            object:nil
                             queue:nil
                        usingBlock:^(NSNotification *note) {
                            AVPlayerItem *video = [[AVPlayerItem alloc] initWithURL:videoURL];
                            [self.avQueuePlayer insertItem:video afterItem:nil];
                            NSLog(@"Video changed");
                        }];

    self = (SDLoopingVideoNode*)[[SKVideoNode alloc] initWithAVPlayer: self.avQueuePlayer];
    return self;
}
return nil;
}


@end

そして、サブクラスが didMoveToView で初期化される方法は次のとおりです。

SDLoopingVideoNode *videoNode = [[SDLoopingVideoNode alloc]initWithPathToResource:@"147406" withFiletype:@"mp4"];
[videoNode setSize:CGSizeMake(self.size.width, self.size.height)];
[videoNode setAnchorPoint:CGPointMake(0.5, 0.5)];
[videoNode setPosition:CGPointMake(0, 0)];
[self addChild:videoNode];
[videoNode play];
4

1 に答える 1

2

簡単な答えは、AVPlayer で動作させることができないということです。私を信じてください、私は試しました。代わりに、H264 ハードウェアを使用して各ビデオ フレームをデコードし、キーフレームとして再エンコードすることで、シームレスなループを実行できます。github リンクはこちら. また、完全なアルファ チャネルをサポートするシームレスなループ レイヤーも作成しました。フルスクリーンの 1x1 ビデオや iPad または iPad Pro のパフォーマンスも優れています。また、このコードではメモリ リークは発生しません。

于 2016-11-16T20:02:07.900 に答える