web-dev-qa-db-fra.com

Comment lire une vidéo dans une UIView sans contrôles, comme un arrière-plan / fond d'écran?

Le but est de lire un fichier vidéo (* .mp4) dans une UIView sans contrôles.

Il servira d'arrière-plan/fond d'écran sur le ViewController et d'autres contrôles, c'est-à-dire la vue de table, les champs de texte, les images seront affichées sur la vue avec la lecture vidéo.

Quelle est la meilleure façon de procéder? Merci

26
Bogdan Laukhin

J'ai atteint l'objectif avec le natif AVPlayer

1. Fondation AV utilisée:

#import <AVFoundation/AVFoundation.h>

2. propriété utilisée pour le joueur:

@property (nonatomic) AVPlayer *avPlayer;

3.Fichier vidéo ajouté dans le dossier "Vidéo" et ajouté "Vidéo" dans le projet

4. initialisé le lecteur

NSString *filepath = [[NSBundle mainBundle] pathForResource:@"shutterstock_v885172.mp4" ofType:nil inDirectory:@"Video"];
NSURL *fileURL = [NSURL fileURLWithPath:filepath];
self.avPlayer = [AVPlayer playerWithURL:fileURL];
self.avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;

AVPlayerLayer *videoLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
videoLayer.frame = self.view.bounds;
videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:videoLayer];

[self.avPlayer play];

5.Abonné à l'événement - la vidéo a été lue jusqu'à la fin

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:[self.avPlayer currentItem]]; 

6. reprise de la lecture de la vidéo dès le début dans la méthode associée

- (void)itemDidFinishPlaying:(NSNotification *)notification {
    AVPlayerItem *player = [notification object];
    [player seekToTime:kCMTimeZero];
}
48
Bogdan Laukhin

Swift

En Swift c'est similaire. Ajoutez la vidéo à votre ensemble de ressources. Ma réponse plus complète est ici .

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var player: AVPlayer?

    @IBOutlet weak var videoViewContainer: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        initializeVideoPlayerWithVideo()
    }

    func initializeVideoPlayerWithVideo() {

        // get the path string for the video from assets
        let videoString:String? = Bundle.main.path(forResource: "SampleVideo_360x240_1mb", ofType: "mp4")
        guard let unwrappedVideoPath = videoString else {return}

        // convert the path string to a url
        let videoUrl = URL(fileURLWithPath: unwrappedVideoPath)

        // initialize the video player with the url
        self.player = AVPlayer(url: videoUrl)

        // create a video layer for the player
        let layer: AVPlayerLayer = AVPlayerLayer(player: player)

        // make the layer the same size as the container view
        layer.frame = videoViewContainer.bounds

        // make the video fill the layer as much as possible while keeping its aspect size
        layer.videoGravity = AVLayerVideoGravity.resizeAspectFill

        // add the layer to the container view
        videoViewContainer.layer.addSublayer(layer)
    }

    @IBAction func playVideoButtonTapped(_ sender: UIButton) {
        // play the video if the player is initialized
        player?.play()
    }
}
7
Suragch