HTTP 实时流媒体

Posted

技术标签:

【中文标题】HTTP 实时流媒体【英文标题】:HTTP LIve Streaming 【发布时间】:2011-09-29 08:48:01 【问题描述】:

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

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

请帮帮我, 谢谢

【问题讨论】:

【参考方案1】:

HTTP 实时流媒体

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

涉及的文件是

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

即使叫直播,视频转换、ts和m3u8文件写入、客户端刷新m3u8文件通常也会有1分钟左右的延迟。

所有这些文件都是您服务器上的静态文件。但在现场活动中,增加了更多的 .ts 文件,并更新了 m3u8 文件。

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

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

示例

获取流媒体工具

要下载 HTTP 实时流媒体工具,请执行以下操作:

获取 Mac 或 iPhone 开发者帐户。 转到https://developer.apple.com 并搜索“HTTP Live Streaming Tools”,或查看https://developer.apple.com/streaming/。

已安装命令行工具:

 /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 $WIDTHx$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 文件。

设置网络服务器

要在 iOS 上播放 .m3u8,我们使用移动 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   src="stream.m3u8" />
</body></html>

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

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

【讨论】:

非常感谢你!!!超级有帮助,我也许能解决这个问题!!!谢谢!!! 在connect.apple.com 上是否仍可从 Apple 获得 HTTP 实时流媒体工具?我问是因为我有一个 iPhone 开发者帐户但看不到下载。 转到developer.apple.com/downloads/index.action并在搜索框中输入http直播工具。 @Jano:先生,我认为您对直播很了解。我通过 mediastreamsegmenter 工具将 mp4(480*270) 视频转换为 15 个 .ts 文件和一个 m3u8。我有狮子操作系统,我的服务器有问题,我想知道如何在 html 上显示流媒体视频。请帮帮我。 myvideo-iphone.ts 为什么我们要创建该文件...我们不能使用 .mp4 文件而不是 .ts 进行媒体文件流式传输【参考方案2】:

这可能有助于 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()
    

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

以上是关于HTTP 实时流媒体的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将 iPhone 中的实时流媒体视频静音

如何获得低于 3.0 版本的 Android 设备的实时流媒体音频?

流媒体技术基础-流媒体编码与协议

JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频

JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频

JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频