Ich versuche ein UITableView einzurichten, das Videos abspielen kann. Viele der vorherigen SO-Fragen dazu verwendet MPMoviePlayer (Playing Video into UITableView, Playing video in UItableView in SWIFT, Playing Video From UITableView), die jetzt in iOS 9 veraltet ist. Einer der wenigen, die AVFoundation (was ich verwende), ist dieser: Play video on UITableViewCell when it is completely visible und ist, wo ich Ich bekomme den größten Teil meines Codes. Hier ist mein Code, innen cellForRowAtIndexPath:Video in der uitableview Zelle abspielen
VideoCell *videoCell = (VideoCell *)[self.tableView dequeueReusableCellWithIdentifier:@"VideoCell"];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
NSURL *url = [[NSURL alloc] initWithString:urlString];
dispatch_async(queue, ^{
videoCell.item = [AVPlayerItem playerItemWithURL:url];
dispatch_sync(dispatch_get_main_queue(), ^{
videoCell.player = [[AVPlayer alloc] initWithPlayerItem:videoCell.item];
videoCell.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:videoCell.player];
playerLayer.frame = CGRectMake(0, 0, videoCell.contentView.frame.size.width, videoCell.contentView.frame.size.height);
[videoCell.contentView.layer addSublayer:playerLayer];
playerLayer.videoGravity = AVLayerVideoGravityResize;
[videoCell.player play];
});
});
return videoCell;
Von dem, was ich verstehe, muss ich asynchron die Videos herunterladen, bevor ich sie spielen. Ich habe Bilder vorher asynchron heruntergeladen und der "Download" Teil beinhaltet immer die Konvertierung von NSURL -> NSData -> UIImage. Und dann, wenn du den UIImage hast, kannst du ihn in der Zelle anzeigen, also bringst du die Hauptwarteschlange hoch und dispatch_async und führst die cell.imageView.image = yourImage aus; in der Hauptwarteschlange.
Hier habe ich eine NSURL, aber ich verstehe nicht ganz, welche Schritte hier in der Hauptwarteschlange sein sollte und welche aus dem Hauptthread sein sollte. Ich habe versucht, was in der oben genannten SO Frage vorgeschlagen wurde, aber bis jetzt funktioniert es nicht. Die Tabellenzelle wird nur geladen, und das Video wird nicht abgespielt. Ich sehe nur den ersten Frame. Manchmal wird die erste 1 Sekunde abgespielt, aber dann puffert es danach und wird es nicht tun. Ich arbeite mit einer Tabellenansicht, die momentan nur über 1 Objekt verfügt. Es gibt also nur ein Video, das wiedergegeben werden kann und es wird immer noch nicht abgespielt.
Was mache ich falsch, und könnte mir jemand helfen, genau zu erklären, welche Teile am Hauptfaden sein müssen und welche? Ein Antwortender in dem Thread, den ich oben erwähnt habe, sagte, es gebe "viele Tutorials dazu", aber nachdem ich Google gescannt habe, habe ich keine gesehen. Die Begriffe "asynchron" und "iOS" zusammen erhalten fast immer Suchergebnisse zum Herunterladen von Bildern, nicht Video. Aber wenn irgendwelche Tutorials existieren, wäre es schön, einen zu sehen.
dank
so rufen Sie diese in cellForRowAtIndexPath? – joey
Nein Ich habe eine benutzerdefinierte Zellklasse erstellt, und ich habe die oben genannte Funktion innerhalb der Datensettermethode aufgerufen. –
Können Sie ein Beispielprojekt erstellen? Danke –