57

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

你写的代码在服务器上?不在xcode中?如果我是对的,我该如何设置?我需要在我的服务器上设置一些特殊的东西吗?像php什么的?如何使用 Apple..segmenter 等提供的工具?

请帮助我,谢谢

4

3 回答 3

137

HTTP 实时流式传输

HTTP Live Streaming 是 Apple 提出的流媒体标准。参见最新的标准草案

涉及的文件是

  • .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 实时流媒体工具,请执行以下操作:

安装的命令行工具:

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

手册页中的描述:

  • 媒体流分段器:从 MPEG-2 传输流创建用于 HTTP 实时流的分段。
  • 媒体文件分段器:从媒体文件创建用于 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 文件。

设置网络服务器

.m3u8在 iOS 上播放 a,我们使用移动 safari 指向文件。当然,首先我们需要将它们放在一个 Web 服务器上。为了让 Safari(或其他播放器)识别 ts 文件,我们需要添加其 MIME 类型。在阿帕奇:

 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 进行有趣的编程。

于 2011-07-06T08:54:44.853 回答
4

这可能有助于迅速:

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

影音播放器:

 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()
    }
于 2016-02-12T05:45:41.627 回答
1

Cloudinary http://cloudinary.com/documentation/video_manipulation_and_delivery#http_live_streaming_hls的另一种解释

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

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

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

于 2016-05-31T12:06:16.470 回答