web-dev-qa-db-fra.com

Implémentation de HTTP Live Streaming dans iOS

Je veux écrire un petit client vidéo iOS et je dois utiliser HTTP Live Streaming. Les vidéos proviennent d'un serveur multimédia Wowza qui prend en charge le streaming HTTP en direct, donc l'implémentation côté serveur n'est pas mon problème. J'ai déjà regardé les vidéos de la WWDC et lu la documentation Apple sur HTTP Live Streaming.

Mais il n'y a nulle part expliqué comment lire les vidéos sur un appareil iOS. Lors d'une conférence sur la WWDC, il a été mentionné qu'il y avait 3 possibilités pour afficher les vidéos:

  • UIWebView
  • MPMoviePlayerController
  • AVPlayerItem

Lequel est le meilleur?

Et comment puis-je lire les URL des vidéos à partir d'une page HTML comme celles-ci, qui sont fournies par le serveur?

<html>
<head>
    <title>HTTP Live Streaming Example</title>
</head>
<body>
    <video
        src="http://devimages.Apple.com/iphone/samples/bipbop/bipbopall.m3u8"
        height="300" width="400"
    >
    </video>
</body>
</html>

(Source: Présentation de la diffusion en direct HTTP Apple )

Je ne sais vraiment pas par où commencer avec le codage ... Peut-être que quelqu'un connaît un meilleur exemple de code que l'ennuyeux "Stitched Stream Player" ou peut écrire un petit tutoriel.

53
Lindemann

Une mise en œuvre courte et précise. L'URL incluse pointe vers un flux valide (au 15/12/2015), mais vous pouvez simplement le remplacer par votre propre URL vers un fichier .m3u8.

Objectif-C:

#import <MediaPlayer/MediaPlayer.h>
@interface ViewController ()
@property (strong, nonatomic) MPMoviePlayerController *streamPlayer;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *streamURL = [NSURL URLWithString:@"http://qthttp.Apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"];

    _streamPlayer = [[MPMoviePlayerController alloc] initWithContentURL:streamURL];

    // depending on your implementation your view may not have it's bounds set here
    // in that case consider calling the following 4 msgs later
    [self.streamPlayer.view setFrame: self.view.bounds];

    self.streamPlayer.controlStyle = MPMovieControlStyleEmbedded;

    [self.view addSubview: self.streamPlayer.view];

    [self.streamPlayer play];
}

- (void)dealloc
{
     // if non-ARC
    // [_streamPlayer release];
    // [super dealloc];
}

@end

Swift:

import UIKit
import MediaPlayer

class ViewController: UIViewController {

     var streamPlayer : MPMoviePlayerController =  MPMoviePlayerController(contentURL: NSURL(string:"http://qthttp.Apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"))

     //Let's play
     override func viewDidLoad() {
         super.viewDidLoad()
         // Do any additional setup after loading the view, typically from a nib.
         streamPlayer.view.frame = self.view.bounds
         self.view.addSubview(streamPlayer.view)

         streamPlayer.fullscreen = true
         // Play the movie!
         streamPlayer.play()
    }

}

Réponse mise à jour pour les deux langues. MPMoviePlayerController est également déconseillé dans iOS 9, mais vous pouvez utiliser AVPlayerViewController à la place. Codage heureux. !!!

55
GnarlyDog

Si vous pointez un UIWebView vers cette URL m3u8 cible, cela fonctionnera simplement.

5
jab

Voici ma solution Swift 4 avec AVPlayer

[puisque MPMoviePlayerController est déconseillé dans iOS 9]

import UIKit
import AVKit
...

class VideoPlayerViewController: UIViewController {

    var player: AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let url = URL(string: "http://stream-url.com/file.m3u8") else {
            print("Umm, looks like an invalid URL!")
            return
        }

        player = AVPlayer(url: url)
        let controller = AVPlayerViewController()
        controller.delegate = self
        controller.player = player

        // present the player controller & play
        present(controller, animated: true) {
            self.player?.play()
        }
    }

}
1
Rao