0

診断できないメモリリークがあります。 AVPlayerLooperのほかに、私が遭遇したアプローチのすべてに、AVPlayerItemDidPlayToEndTimeNotificationを見るためのオブザーバーを作成してから、AVPlayerの場合はビデオの先頭に移動します。ループするビデオをビデオキューに挿入します(AVQueuePlayerの場合)。どちらも同じようなパフォーマンスを持つようですが、どちらもseekToTimeメソッド(AVPlayerの場合)とinsertItemメソッド(AVQueuePlayerの場合)に関連した一貫したメモリの保持があります。私の最終目標は、デフォルトでループするSKVideoNodeのサブクラスを作成することです。以下は、サブクラスのための私のコードです:ループからのメモリリーク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]; 
+0

私が気付いた別の奇妙なことに、このメモリリークはデバイス上にしか現れません。シミュレータ上で実行されたときにメモリリークはありません。 –

答えて

2

短い答えは、あなたがAVPlayerで作業することを取得することができなくなります、です。私を信じて、私は試しました。代わりに、H264ハードウェアを使用して各ビデオフレームをデコードしてから、キーフレームとしてgithub link hereとして再エンコードすることで、シームレスなループ処理を行うことができます。また、完全なアルファチャンネルをサポートするシームレスなループレイヤーを構築しました。フルスクリーンの1x1ビデオやiPadやiPadのプロフェッショナルのためのパフォーマンスも素晴らしいです。また、このコードではメモリリークは発生しません。

+0

返信いただきありがとうございます!それはあなたのプロジェクトですか?私はこのプロジェクトを今すぐダウンロードして見ました。ループは素晴らしいですが、そのループされたビデオをSKVideoNodeに埋め込む方法を知っていますか?私が望む効果は、Sprite Kitのビデオ背景です。 –

+0

上記のコードのループは正常に機能しますが、AVQueuePlayerでSKVideoNodeを初期化し、ビデオをキューに追加すると、すべてのビデオループでメモリリンクが発生します。 –

+0

いいえ、SKVideoNodeに直接埋め込むことはできません。しかし、デコードしてビデオフレームをピクセルバッファにレンダリングし、そのピクセルバッファを通常のSKSpriteNodeノードのテクスチャとして設定することができます。メモリの使用を最小限に抑えるために、SKMutableTextureを使用し、非同期コールバックがピクセルバッファの内容をコピーするのを待つことができます。 – MoDJ

関連する問題