HTTP LIve Streaming

时间:2011-07-06 06:41:34

标签: ios video-streaming http-live-streaming

好的,我一直在尝试围绕这个http直播流媒体。我只是不明白,是的,我已经阅读了所有的苹果文档并观看了wwdc视频,但仍然非常困惑,所以请帮助一个想成为一个程序员!

您编写的代码是否在服务器上?不是在xcode? 如果我是对的,我如何设置它? 我需要在服务器上设置一些特殊的东西吗?喜欢php还是什么? 如何使用Apple .. segmenter等提供的工具?

请帮帮我, 感谢

3 个答案:

答案 0 :(得分:132)

HTTP直播

HTTP Live Streaming是Apple提出的流媒体标准。查看最新的draft standard

涉及的文件是

  • .m4a用于音频(如果您只想要音频流)。
  • .ts视频。这是MPEG-2传输,通常具有h.264 / AAC有效载荷。它包含10秒的视频,它是通过拆分原始视频文件或转换实时视频来创建的。
  • .m3u8播放列表。这是WinAmp格式的UTF-8版本。

即使它被称为实时流式传输,通常会有一分钟左右的延迟,在此期间视频转换,写入ts和m3u8文件,并且客户端刷新m3u8文件。

所有这些文件都是服务器上的静态文件。但在实时事件中,会添加更多.ts文件,并更新m3u8文件。

由于您在iOS上标记了这个问题,因此提及相关的App Store规则是相关的:

  • 对于小于10分钟或每5分钟5 MB的视频,您只能使用渐进式下载。否则,您必须使用HTTP Live Streaming。
  • 如果您使用HTTP直播,则必须提供至少一个64 Kbps或更低带宽的流(低带宽流可能是仅音频流或带有静止图像的音频)。

实施例

获取流媒体工具

要下载HTTP Live Streaming Tools,请执行以下操作:

安装了命令行工具:

 /usr/bin/mediastreamsegmenter
 /usr/bin/mediafilesegmenter
 /usr/bin/variantplaylistcreator
 /usr/bin/mediastreamvalidator
 /usr/bin/id3taggenerator

手册页的描述:

  • 媒体流分段器:从用于HTTP直播的MPEG-2传输流创建分段。
  • 媒体文件分段:为媒体文件中的HTTP直播流创建片段。
  • Variant Playlist Creator:创建播放列表,以便从mediafilesegmenter创建的HTTP Live流媒体片段进行流切换。
  • 媒体流验证程序:验证HTTP直播流和服务器。
  • ID3标记生成器:创建ID3标记。

制作视频

安装Macports,转到终端并sudo port install ffmpeg。然后使用此FFMpeg脚本将视频转换为传输流(.ts):

# bitrate, width, and height, you may want to change this
BR=512k
WIDTH=432
HEIGHT=240
input=${1}

# strip off the file extension
output=$(echo ${input} | sed 's/\..*//' )

# works for most videos
ffmpeg -y -i ${input} -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -s ${WIDTH}x${HEIGHT} -vcodec libx264 -b ${BR} -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 7 -trellis 0 -refs 0 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate ${BR} -bufsize ${BR} -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 30 -qmax 51 -qdiff 4 -level 30 -aspect ${WIDTH}:${HEIGHT} -g 30 -async 2 ${output}-iphone.ts

这将生成一个.ts文件。现在我们需要分段分割文件并创建包含所有这些文件的播放列表。我们可以使用Apple的mediafilesegmenter

mediafilesegmenter -t 10 myvideo-iphone.ts

这将为视频的每10秒生成一个.ts文件以及指向所有视频的.m3u8文件。

设置Web服务器

要在iOS上播放.m3u8,我们会指向带有移动版Safari的文件。 当然,首先我们需要将它们放在Web服务器上。要让Safari(或其他播放器)识别ts文件,我们需要添加其MIME类型。在Apache中:

 AddType application/x-mpegURL m3u8
 AddType video/MP2T ts

在lighttpd中:

 mimetype.assign = ( ".m3u8" => "application/x-mpegURL", ".ts" => "video/MP2T" )

要从网页链接:

<html><head>
    <meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
</head><body>
    <video width="320" height="240" src="stream.m3u8" />
</body></html>

要检测设备方向,请参阅Detect and Set the iPhone & iPad's Viewport Orientation Using JavaScript, CSS and Meta Tags

您可以做的更多事情是创建视频的不同比特率版本,嵌入元数据以在作为通知播放时阅读它,当然还可以使用MoviePlayerController和AVPlayer进行有趣的编程。

答案 1 :(得分:4)

这可能有助于 swift:

    import UIKit
    import MediaPlayer

 class ViewController: UIViewController {

     var streamPlayer : MPMoviePlayerController =  MPMoviePlayerController(contentURL: NSURL(string:"http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"))
     override func viewDidLoad() {
         super.viewDidLoad()
         streamPlayer.view.frame = self.view.bounds
         self.view.addSubview(streamPlayer.view)

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

从iOS 9开始,不推荐使用MPMoviePlayerController。我们可以使用AVPlayerViewController()或AVPlayer来实现此目的。看看:

import AVKit
import AVFoundation
import UIKit

AVPlayerViewController:

override func viewDidAppear(animated: Bool){
let videoURL = NSURL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(URL: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.presentViewController(playerViewController, animated: true) {
    playerViewController.player!.play()
}
}

AVPlayer:

 override func viewDidAppear(animated: Bool){
    let videoURL = NSURL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
    let player = AVPlayer(URL: videoURL!)
    let playerLayer = AVPlayerLayer(player: player)
    playerLayer.frame = self.view.bounds
    self.view.layer.addSublayer(playerLayer)
    player.play()
    }

答案 2 :(得分:1)

Cloudinary http://cloudinary.com/documentation/video_manipulation_and_delivery#http_live_streaming_hls

的另一个解释
  

HTTP Live Streaming(也称为HLS)是一种基于HTTP的媒体流通信协议,提供可扩展且可适应不同网络的机制。 HLS的工作原理是将视频文件分解为一系列基于HTTP的小文件下载,每个下载加载一个视频文件的一小部分。

     

当播放视频流时,客户端播放器可以从包含以各种数据速率编码的相同材料的多个不同备用视频流中进行选择,从而允许流式会话以高质量播放适应可用数据速率在带宽减少的网络上具有高带宽和低质量回放的网络上。

     

在流式传输会话开始时,客户端软件下载主M3U8播放列表文件,其中包含可用的各种子流的元数据。然后,客户端软件根据预定义的因素(如设备类型,分辨率,数据速率,大小等)决定从可用的媒体文件下载什么。