HTTPstream媒体
好吧,我一直在试图围绕这个HTTP直播stream。 我只是不明白,是的,我已经阅读了所有的苹果文件,并观看了wwdcvideo,但仍然超级困惑,所以请帮助一个想成为一个程序员!
你写的代码放在服务器上? 不是在Xcode? 如果我是对的,我该如何设置? 我需要在我的服务器上设置一些特殊的东西吗? 像PHP或什么的? 如何使用由Apple提供的工具.. segmenter等?
请帮助我,谢谢
HTTP直播stream媒体
HTTP Live Streaming是由Apple提出的stream媒体标准。 见最新的标准草案 。
涉及的文件是
-
.m4a
的audio(如果你只想要一个audiostream)。 -
.ts
video。 这是一个MPEG-2传输,通常带有h.264 / AAC有效载荷。 它包含10秒的video,它是通过分割您的原始video文件,或通过转换实时video创build的。 -
.m3u8
播放列表。 这是WinAmp格式的UTF-8版本。
即使被称为直播,通常延迟一分钟左右,video转换,写入ts和m3u8文件,客户端刷新m3u8文件。
所有这些文件都是服务器上的静态文件。 但在现场活动中,会添加更多的.ts文件,并更新m3u8文件。
既然你标记了这个问题的iOS是相关的提及相关的App Store规则:
- 对于小于10分钟的video,或者每5分钟5 MB,您只能使用渐进式下载。 否则,您必须使用HTTP直播stream。
- 如果您使用HTTP Live Streaming,您必须至less提供一个64 Kbps或更低带宽的stream(低带宽stream可能是纯audio或带有静止图像的audio)。
例
获取stream媒体工具
要下载HTTP Live Streaming Tools,请执行以下操作:
- 获取Mac或iPhone开发者帐户。
- 访问http://connect.apple.com并search“HTTP Live Streaming Tools”,或浏览http://developer.apple.com/resources/http-streaming/ 。
命令行工具已安装:
/usr/bin/mediastreamsegmenter /usr/bin/mediafilesegmenter /usr/bin/variantplaylistcreator /usr/bin/mediastreamvalidator /usr/bin/id3taggenerator
手册页中的说明:
- 媒体stream分段器:为来自HTTP实况stream的MPEG-2传输stream创build分段。
- 媒体文件分段器:为来自媒体文件的HTTP实况stream创build分段。
- Variant Playlist Creator:创build播放列表,用于从mediafilesegmenter创build的HTTP Livestream媒体片段进行stream切换。
- 媒体streamvalidation程序:validationHTTP实时stream式传输stream和服务器。
- ID3标签生成器:创buildID3标签。
创buildvideo
安装Macports,去terminal和sudo port install ffmpeg
。 然后使用这个FFMpeg脚本将video转换为传输stream(.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文件。 现在我们需要将文件分段分割,并创build一个包含所有这些文件的播放列表。 我们可以使用苹果公司的mediafilesegmenter
:
mediafilesegmenter -t 10 myvideo-iphone.ts
这将生成一个.ts文件每10秒的video加一个.m3u8文件指向他们所有人。
设置一个Web服务器
要在iOS上播放.m3u8
,我们使用移动Safari浏览器指向该文件。 当然,首先我们需要把它们放在一个Web服务器上。 对于Safari(或其他播放器)来识别ts文件,我们需要添加它的MIMEtypes。 在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的视口方向 。
更多的东西,你可以做的是创buildvideo的不同比特率的版本,embedded元数据阅读,而作为通知播放,当然有有趣的编程与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() } }
MPMoviePlayerController已从iOS 9开始弃用。 我们可以使用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实时stream媒体(也称为HLS)是一种基于HTTP的媒体stream通信协议,它提供了可扩展和适应不同networking的机制。 HLS通过将video文件分解成一系列基于HTTP的小型文件下载来实现,每次下载都会加载一小段video文件。
当播放videostream时,客户端播放器可以从包含以各种数据速率编码的相同素材的许多不同的替代videostream中进行select,从而允许stream播会话适应可用数据速率,并在networking上以高质量播放带宽减less的networking上的高带宽和低质量回放。
在stream会话开始时,客户端软件下载包含用于可用的各种子stream的元数据的主M3U8播放列表文件。 然后,客户端软件根据预定义的因素(如设备types,分辨率,数据速率,大小等)决定要从可用的媒体文件中下载什么内容。