25 Stimmen

AVPlayer spielt weiter, nachdem der ViewController vom NavigationController entfernt wurde

Also ich bin mit ARC in meinem Projekt und wenn ich einen AVPlayerLayer hinzufügen, es funktioniert einfach gut und dandy, aber wenn ich die UIViewController von meinem UINavigationItem Pop das Video weiterhin im Hintergrund zu spielen. Weiß jemand, wie Sie dies behandeln würde? Es scheint etwas einfaches zu sein, das ich gerade übersehe. Hier ist der Code, den ich für die anfänglichen Instanziierungen habe.

self.currentItem = [[AVPlayerItem alloc] initWithURL:url];

self.player = [[AVPlayer alloc]initWithPlayerItem:self.currentItem];
self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:player];

self.avPlayerLayer.bounds = self.view.bounds;
self.avPlayerLayer.frame = CGRectMake(0,55, 1024, 670);

self.view.backgroundColor = [UIColor clearColor];

[self.view.layer addSublayer:avPlayerLayer];

So habe ich auch die Eigenschaften definiert.

@property (strong) AVPlayer *player;
@property (strong) AVPlayerLayer *avPlayerLayer;
@property (strong) AVPlayerItem *currentItem;

Vielleicht ist auch das völlig falsch. Ich bin mir nicht ganz sicher, wann ich (stark) und wann (schwach) verwenden soll. Auf jeden Fall danke ich Ihnen im Voraus für jede Hilfe.

17voto

isaac Punkte 4857

Wenn avPlayerLayer die einzige Klasse ist, die mit dem avPlayer interagiert, brauchen Sie keinen Verweis auf ihn mit einer Eigenschaft in der Klasse zu pflegen, die Sie zur Darstellung verwenden (es sei denn, diese Klasse verwendet ihn außerhalb des von Ihnen freigegebenen Codes). Das ist wahrscheinlich auch der Grund, warum es nicht so funktioniert, wie Sie es erwarten.

Der Grund dafür, dass der Clip weiter abgespielt wird, ist (glaube ich), dass der Player nicht freigegeben wird. Sie erstellen ihn, besitzen ihn mit dem stark Eigenschaft in Ihrer Klasse, dann gehört sie wieder der AVPlayerLayer-Klasse, an die Sie sie übergeben. Wenn also der AVPlayerLayer freigegeben wird, verliert der AVPlayer einen Besitzer. Aber er hat immer noch einen Besitzer (deine Klasse), also wird er nicht freigegeben und spielt weiter. Die Lösung besteht darin, die Eigenschaft owning für *avPlayer ganz abzuschaffen. Du brauchst sie nicht. Erstellen Sie den AVPlayer und übergeben Sie ihn an AVPlayerLayer. Das sollte alles sein, was benötigt wird.

Sie können auch etwas anderes tun, das vielleicht das Verhalten, aber nicht das Problem behebt, nämlich anrufen:

[avPlayer pause]

In der dealloc-Methode Ihres AVPlayerLayers.

Re: Starke vs. Schwache Referenzen: Eine starke Referenz impliziert Eigentum. Da ARC den Speicher verwaltet, übernimmt es alle Aufgaben, die Sie früher im Code oder mit Eigenschaften erledigt hätten:

@property (retain) NSObject *iAmRetainedWhenProperyIsAssigned;

Donc jetzt Mit ARC verwenden wir einfache Benutzer keine Wörter wie "retain" oder "release" im Code oder bei der Definition von Eigenschaften. Aber wir entwerfen trotzdem Software. ARC ist intelligent, aber nicht intelligent genug, um die architektonischen Implikationen von Beziehungen, die wir definieren, abzuleiten. Man muss ihm immer noch sagen, dass eine Klasse einen Verweis auf das Objekt "besitzt", auf das sich die Eigenschaft bezieht. Das bedeutet, dass wir in den grundlegendsten Begriffen reduziert werden:

(strong) bedeutet für ARC, was (retain) für Immobilien vor ARC bedeutete (owned/retained)

(weak) bedeutet für ARC, was (assign) für properites vor ARC bedeutete (not owned/not retained)

14voto

Vijyendra Sisodia Punkte 141

Vielleicht haben Sie keine Pause gemacht. Tun Sie es und entfernen Sie dann Schicht und annullieren player .

[player Pause];
[player removefromsuperlayer];
player = nil;

1voto

BigCheesy Punkte 1118

Wenn Sie das Laden eines AVPlayerItems stoppen möchten, verwenden Sie removeAllItems von AVQueuePlayer und initialisieren Sie es dann neu.

  [self.avPlayer removeAllItems];
  self.avPlayer = [AVQueuePlayer playerWithURL:[NSURL URLWithString:@""]];
  self.avPlayer = nil;

Dadurch wird das Laden des aktuellen Elements gestoppt - das ist die einzige Möglichkeit, die ich gefunden habe, um dies zu erreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X