HTTP直播流传输技术

59

好的,我一直在试图理解这个HTTP流媒体。但是我并不理解它,我看过所有的苹果文档和观看了WWDC的视频,但仍然超级困惑,所以请帮助一个想成为程序员的人!!!

你编写的代码放在服务器上?而不是在Xcode中? 如果我是对的,我该如何设置它? 我需要在我的服务器上设置特殊的东西吗?比如PHP之类的? 如何使用苹果提供的工具.. 比如片段化器(segmenter)等?

请帮帮我, 谢谢

3个回答

139

HTTP Live Streaming

HTTP Live Streaming是由苹果提出的一种流媒体标准。查看最新的草案标准

涉及到的文件有:

  • .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 Live Streaming,则必须提供至少一个64 Kbps或更低带宽的流(低带宽流可以是仅音频或带有静止图像的音频)。

示例

获取流媒体工具

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

命令行工具已安装:

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

以下为 man 页面的描述:

  • 媒体流分段器:从 MPEG-2 传输流创建用于 HTTP Live Streaming 的段。
  • 媒体文件分段器:从媒体文件创建用于 HTTP Live Streaming 的段。
  • 变体播放列表创建器:从媒体文件分段器创建的 HTTP Live streaming 段创建播放列表以进行流切换。
  • 媒体流验证器:验证 HTTP Live Streaming 流和服务器。
  • 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 文件。现在我们需要将文件分割成片段,并创建一个包含所有这些文件的播放列表。我们可以使用苹果的 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>

检测设备方向请参阅使用JavaScript、CSS和元标记检测和设置iPhone和iPad的视口方向

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


3
非常感谢!!!非常有帮助,我也许能够弄清楚这件事!!!谢谢你!!! - Mike Owens
1
前往 https://developer.apple.com/downloads/index.action 并在搜索框中输入 HTTP 直播流工具。 - Jano
@jano 我们如何将stdin指定为mediafilesegmenter的输入文件? - rydgaze
1
@Jano,所以HTTP Live Streaming与渐进式下载不同?在我的情况下,我只需将URL传递给AVPlayer,它就会完成剩下的工作,那么我如何知道我是否正在使用HTTP Live Streaming? - onmyway133
那么.mp3文件转成.m3u8怎么样? - user2053760
显示剩余5条评论

5
这可能对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()
    }

1

Cloudinary还有一个解释http://cloudinary.com/documentation/video_manipulation_and_delivery#http_live_streaming_hls

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接