wake-up-neo.com

Implementierung von HTTP Live Streaming in iOS

Ich möchte einen kleinen iOS-Video-Client schreiben und muss HTTP Live Streaming verwenden. Die Videos stammen von einem Wowza Media Server, der HTTP Live Streaming unterstützt. Die serverseitige Implementierung ist also nicht mein Problem. Ich habe mir bereits die WWDC-Videos angesehen und die Apple - Dokumentation zu HTTP Live Streaming gelesen.

Es wird jedoch nirgendwo erklärt, wie die Videos auf einem iOS-Gerät wiedergegeben werden. In einem WWDC-Vortrag wurde erwähnt, dass es 3 Möglichkeiten gibt, die Videos anzuzeigen:

  • UIWebView
  • MPMoviePlayerController
  • AVPlayerItem

Welches ist das beste?

Und wie kann ich die Video-URLs von einer solchen HTML-Seite auslesen, die der Server zur Verfügung stellt?

<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>

(Quelle: Apple HTTP Live Streaming Übersicht )

Ich weiß wirklich nicht, wo ich mit dem Codieren anfangen soll ... Vielleicht kennt jemand einen besseren Beispielcode als den nervigen "Stitched Stream Player" oder kann ein kleines Tutorial schreiben.

53
Lindemann

Eine kurze und präzise Umsetzung. Die enthaltene URL verweist auf einen gültigen Stream (Stand: 15.12.2015). Sie können sie jedoch einfach durch Ihre eigene URL für eine .m3u8-Datei ersetzen.

Ziel-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()
    }

}

Aktualisierte Antwort für beide Sprachen. Auch MPMoviePlayerController ist in iOS 9 veraltet, aber Sie können stattdessen AVPlayerViewController verwenden. Happy Coding. !!!

55
GnarlyDog

Wenn Sie eine UIWebView auf diese m3u8-Ziel-URL verweisen, funktioniert dies nur.

5
jab

Unten ist meine Swift 4 Lösung mit AVPlayer

[da MPMoviePlayerController in iOS 9 veraltet ist]

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