web-dev-qa-db-ja.com

HTTPライブストリーミング

わかりました、私はこのhttpライブストリーミングの周りに私の頭をラップしようとしています。私はそれを理解していないし、はい、すべてのApple docsを読んでwwdcビデオを見ましたが、それでも非常に混乱しているので、プログラマーになりたいです!!!

書いたコードはサーバーに送られますか? Xcodeではない?私が正しい場合、これをどのように設定しますか?サーバーに特別なものをセットアップする必要がありますか? phpまたは何かのような? Apple ..セグメンターなどが提供するツールはどのように使用しますか?

助けてください、ありがとう

54
Mike Owens

HTTPライブストリーミング

HTTPライブストリーミングは、Appleによって提案されたストリーミング標準です。最新の ドラフト標準 を参照してください。

関係するファイルは

  • .m4aオーディオ用(オーディオのストリームのみが必要な場合)。
  • .tsビデオ用。これは、通常h.264/AACペイロードを持つMPEG-2トランスポートです。 10秒のビデオが含まれており、元のビデオファイルを分割するか、ライブビデオを変換することにより作成されます。
  • .m3u8プレイリスト用。これは、WinAmp形式のUTF-8バージョンです。

ライブストリーミングと呼ばれる場合でも、通常、ビデオが変換され、tsおよびm3u8ファイルが書き込まれ、クライアントがm3u8ファイルを更新するのに1分程度の遅延があります。

これらのファイルはすべて、サーバー上の静的ファイルです。ただし、ライブイベントでは、さらに.tsファイルが追加され、m3u8ファイルが更新されます。

この質問にiOSをタグ付けしたので、関連するApp Storeルールに言及することが重要です。

  • プログレッシブダウンロードは、10分または5分ごとに5 MB未満のビデオにのみ使用できます。それ以外の場合は、HTTPライブストリーミングを使用する必要があります。
  • HTTPライブストリーミングを使用する場合は、64 Kbps=またはそれより低い帯域幅で少なくとも1つのストリームを提供する必要があります(低帯域幅のストリームは、音声のみ、または静止画像の音声)。

ストリーミングツールを入手する

HTTPライブストリーミングツールをダウンロードするには、次の操作を行います。

インストールされているコマンドラインツール:

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

Manページの説明:

  • メディアストリームセグメンター:HTTPライブストリーミング用のMPEG-2トランスポートストリームからセグメントを作成します。
  • メディアファイルセグメンター:メディアファイルからHTTPライブストリーミング用のセグメントを作成します。
  • Variant Playlist Creator:mediafilesegmenterによって作成されたHTTPライブストリーミングセグメントからのストリームスイッチング用のプレイリストを作成します。
  • Media Stream Validator:HTTPライブストリーミングのストリームとサーバーを検証します。
  • ID3 Tag Generator: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

これにより、1つの.tsファイルが生成されます。次に、ファイルをセグメントに分割し、それらすべてのファイルを含むプレイリストを作成する必要があります。これにはAppleのmediafilesegmenterを使用できます。

mediafilesegmenter -t 10 myvideo-iphone.ts

これにより、ビデオの10秒ごとに1つの.tsファイルと、それらすべてを指す.m3u8ファイルが生成されます。

Webサーバーをセットアップする

IOSで.m3u8を再生するには、モバイルサファリでファイルをポイントします。もちろん、最初にWebサーバーに配置する必要があります。 Safari(または他のプレーヤー)がtsファイルを認識するためには、MIMEタイプを追加する必要があります。 Apacheの場合:

 AddType application/x-mpegURL m3u8
 AddType video/MP2T ts

Lighttpdの場合:

 mimetype.assign = ( ".m3u8" => "application/x-mpegURL", ".ts" => "video/MP2T" )

これをWebページからリンクするには:

<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で楽しいプログラミングをすることです。

133
Jano

これは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()
}
}

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()
    }
4
A.G

Cloudinaryからの別の説明 http://cloudinary.com/documentation/video_manipulation_and_delivery#http_live_streaming_hls

HTTPライブストリーミング(HLSとも呼ばれる)は、さまざまなネットワークにスケーラブルで適応可能なメカニズムを提供するHTTPベースのメディアストリーミング通信プロトコルです。 HLSは、ビデオファイルを一連の小さなHTTPベースのファイルダウンロードに分解し、各ダウンロードでビデオファイルの短いチャンクを1つロードすることで機能します。

ビデオストリームが再生されると、クライアントプレーヤーはさまざまなデータレートでエンコードされた同じ素材を含むさまざまな代替ビデオストリームから選択できるため、ストリーミングセッションは、帯域幅が削減されたネットワークでの高帯域幅および低品質の再生。

ストリーミングセッションの開始時に、クライアントソフトウェアは、利用可能なさまざまなサブストリームのメタデータを含むマスターM3U8プレイリストファイルをダウンロードします。クライアントソフトウェアは、デバイスタイプ、解像度、データレート、サイズなどの事前定義された要因に基づいて、利用可能なメディアファイルから何をダウンロードするかを決定します。

1
onmyway133