iOS中HTTP Live Streaming的实现

Posted

技术标签:

【中文标题】iOS中HTTP Live Streaming的实现【英文标题】:Implementation of HTTP Live Streaming in iOS 【发布时间】:2012-01-07 16:00:32 【问题描述】:

我想编写一个小的 ios 视频客户端,并且必须使用 HTTP Live Streaming。视频来自支持 HTTP Live Streaming 的 Wowza 媒体服务器,所以服务器端的实现不是我的问题。 我已经观看了 WWDC 视频并阅读了有关 HTTP Live Streaming 的 Apple 文档。

但没有任何地方解释如何在 iOS 设备上播放视频。在 WWDC-talk 中提到有 3 种显示视频的可能性:

UIWebView MPMoviePlayerController AVPlayerItem

哪个是最好的?

我怎样才能从服务器提供的 html 页面中读取视频 URL?

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

(来源:Apple HTTP Live Streaming Overview)

我真的不知道从哪里开始编码...也许有人知道比烦人的“Stitched Stream Player”更好的示例代码,或者可以写一个小教程。

【问题讨论】:

【参考方案1】:

如果您将 UIWebView 指向该目标 m3u8 URL,它将正常工作。

【讨论】:

【参考方案2】:

简明扼要的实现。包含的 URL 指向一个有效的流(截至 2015 年 12 月 15 日),但您可以将自己的 URL 替换为 .m3u8 文件。

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

斯威夫特:

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


更新了两种语言的答案。此外,MPMoviePlayerController 在 iOS 9 中已弃用,但您可以改用 AVPlayerViewController。快乐编码。!!!

【讨论】:

H 克里斯。感谢您的简单示例。它工作得很好。我想知道如何从视频创建 .m3u8 文件? 您好,感谢您的提醒。我厌倦了为托管一个我显然没有更新的博客付费。所以我把博文移到了 Gist 页面:gist.github.com/chrislavender/cad26500c9655627544f 如果要创建自己的 HLS 内容,您可以通过 mediafilesegmenter 创建清晰和加密的内容以使用此 HLS 内容,您需要将此 TS 卡盘上传到 apache 服务器(带有 CA 签名的 HTTP 或 HTTPS) 【参考方案3】:

下面是我的 Swift 4 解决方案,AVPlayer

[因为 MPMoviePlayerController 在 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()
        
    


【讨论】:

以上是关于iOS中HTTP Live Streaming的实现的主要内容,如果未能解决你的问题,请参考以下文章

转: HTTP Live Streaming直播(iOS直播)技术分析与实现

HTTP Live Streaming直播(iOS直播)技术分析与实现

iOS_直播类app_HTTP Live Streaming

iOS_直播类app_HTTP Live Streaming

如何使用iOS实现视频的直播点播缓存?-HTTP Live Streaming (HLS)

HTTP Live Streaming直播(iOS直播)技术分析与实现