好的,我一直在试图理解这个HTTP流媒体。但是我并不理解它,我看过所有的苹果文档和观看了WWDC的视频,但仍然超级困惑,所以请帮助一个想成为程序员的人!!!
你编写的代码放在服务器上?而不是在Xcode中? 如果我是对的,我该如何设置它? 我需要在我的服务器上设置特殊的东西吗?比如PHP之类的? 如何使用苹果提供的工具.. 比如片段化器(segmenter)等?
请帮帮我, 谢谢
好的,我一直在试图理解这个HTTP流媒体。但是我并不理解它,我看过所有的苹果文档和观看了WWDC的视频,但仍然超级困惑,所以请帮助一个想成为程序员的人!!!
你编写的代码放在服务器上?而不是在Xcode中? 如果我是对的,我该如何设置它? 我需要在我的服务器上设置特殊的东西吗?比如PHP之类的? 如何使用苹果提供的工具.. 比如片段化器(segmenter)等?
请帮帮我, 谢谢
HTTP Live Streaming是由苹果提出的一种流媒体标准。查看最新的草案标准。
涉及到的文件有:
.m4a
是音频文件(如果您只想要音频流)。.ts
是视频文件,这是MPEG-2传输格式,通常具有h.264 / AAC有效负载。它包含10秒钟的视频,并且通过拆分原始视频文件或转换实时视频来创建。.m3u8
是播放列表文件。这是WinAmp格式的UTF-8版本。即使被称为直播流,通常也会有大约一分钟的延迟,在此期间视频会被转换,ts和m3u8文件被写入,您的客户端会刷新m3u8文件。
所有这些文件都是您服务器上的静态文件。但是在直播事件中,会添加更多的.ts文件,并更新m3u8文件。
由于您标记了此问题iOS,因此值得提到相关的App Store规则:
要下载HTTP Live Streaming工具,请执行以下操作:
命令行工具已安装:
/usr/bin/mediastreamsegmenter
/usr/bin/mediafilesegmenter
/usr/bin/variantplaylistcreator
/usr/bin/mediastreamvalidator
/usr/bin/id3taggenerator
以下为 man 页面的描述:
安装 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文件。
要在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进行有趣的编程。
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()
}
Cloudinary还有一个解释http://cloudinary.com/documentation/video_manipulation_and_delivery#http_live_streaming_hls:
HTTP Live Streaming(也称为HLS)是一种基于HTTP的媒体流通信协议,提供了可适应不同网络的可扩展机制。 HLS通过将视频文件分解为一系列小的基于HTTP的文件下载来工作,每个下载加载视频文件的一个短片段。
随着视频流的播放,客户端播放器可以从多个包含相同材料以各种数据速率编码的不同备用视频流中进行选择,允许流媒体会话适应具有高带宽的网络上的高质量播放和带宽降低的网络上的低质量播放。
在流媒体会话开始时,客户端软件会下载一个包含可用子流的元数据的主M3U8播放列表文件。然后,客户端软件根据预定义的因素(例如设备类型,分辨率,数据速率,大小等)决定从可用的媒体文件中下载什么。