web-dev-qa-db-ja.com

HTTPライブストリーミング:Linuxの悪夢

私はiPhoneで音楽VODアプリに取り組んでいます。Appleガイドラインのおかげで、AppStoreで受け入れられるようにHTTPライブストリーミングを実行する必要があります。しかし、Appleは地球上のサーバーの約98%を気にしていないため、Linuxベースのシステム用の魔法のようなHTTPライブストリーミングツールを提供していません。この時点から、悪夢が始まります。

私の目標は単純です。MP3を使用してセグメント化し、単純な.m3u8インデックスファイルを生成します。私は「HTTP Live Streaming Linux」と「Oh great!多くの人がすでにそれを行っています」とグーグルしました!

最初に、私は カーソンマクドナルドによる(とても有名な)投稿 を訪問しました。結果:svn segmentate.cは古く、バグが多く、コンパイルするのが悪夢でした(この世界の誰も、使用しているffmpegのバージョンを正確に知ることはできません!)。それから私は Carsonのgit repo に出くわしましたが、残念ながらRubyの要素がたくさんあり、live_segmenter.cはmp3ファイルを取得できません。

その後、さらに深く検索しました。私は このstackoverflowトピック を見つけました、そしてそれはまさに私がやりたいことです。したがって、私は このスクリプト(httpsegmenter) を使用するようにju​​uniからのアドバイスに従いました。結果:何もコンパイルできず、2日間の作業で、最終的にコンパイルすることができました(ffmpeg 8.1 w/httpsegmenter rev17)。いいえ、これは良いスクリプトではありません。mp3ファイルが必要ですが、生成されたtsファイルとインデックスファイルはプレーヤーで読み取ることができません。

それから、ポストkrisbulmanの作者は解決策を思いついて、パッチを当てたバージョンのm3u8-segmenterを自分で( git repo )で提供しました。私はそれをテストします:コンパイルせず、何もしません。だから私はjohnf https://github.com/johnf/m3u8-segmenter から元のバージョンを取得しました。私はなんとかそれをコンパイルして奇跡を起こしました(実際にはそうではありません)。私はこのコマンドラインを使用しました(ffmpeg 0.8.1):

ffmpeg -er 4 -i music.mp3 -f mpegts -acodec libmp3lame -ar 44100 -ab 128k -vn - | m3u8-segmenter -i - -d 10 -p outputdir/prefix -m outputdir/output.m3u8 -u http://test.com/

このスクリプトは、mp3ファイルをエンコードし(4秒かかりますが、長すぎます)、m3u8-segmenterに渡して、10秒の.TSファイルにセグメント化します。

私はこのストリームを私のMacでAppleのmediastreamvalidatorを使ってテストしましたが、大丈夫だと言っていました。だから私はそれをquicktimeに入れましたが、各.TSファイルの間に約0.2秒の空白があります!!

これが私の状況です。悪夢です。HLSプロトコルで単純なmp3ストリームを取得できません。 MP3をセグメント化する簡単な作業ソリューションはありますか? Appleのmediafilesegmenterのように、mp3ファイルを複数のmp3ファイルに直接セグメント化できないのはなぜですか?

22
user1432439

0.2秒の中断を解消するlibmp3lameのlibfaac insteamを使用します。

5
vchola

Elastic Transcoder Service-AES暗号化が必要ない場合は、MP3をS3バケットに入れて処理するだけです。

http://aws.Amazon.com/elastictranscoder/

その後、Cloudfront CDNサポートを追加することもできます。 (追伸私はあなたの痛みを完全に感謝します、このスペース全体が悪夢です)。

4

ライブストリーミングの場合のみ、RTMPモジュールを使用したNginxを試す必要があります。 https://github.com/arut/nginx-rtmp-module Live HLSはかなりうまく機能しますが、looooongバッファーを使用します。ただし、オンデマンドHLSストリーミングはサポートしていません。

モジュールの構成の例

# HLS requires libavformat & should be configured as a separate
# NGINX module in addition to nginx-rtmp-module:
# ./configure ... --add-module=/path/to/nginx-rtmp-module/hls ...
# For HLS to work please create a directory in tmpfs (/tmp/app here)
# for the fragments. The directory contents is served via HTTP (see
# http{} section in config)
#
# Incoming stream must be in H264/AAC/MP3. For iPhones use baseline H264
# profile (see ffmpeg example).
# This example creates RTMP stream from movie ready for HLS:
#
# ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264 
#    -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1 
#    -f flv rtmp://localhost:1935/hls/movie
#
# If you need to transcode live stream use 'exec' feature.
#
application hls {
    live on;
    hls on;
    hls_path /tmp/app;
    hls_fragment 5s;
}
2
kubanoid

Httpsegmenterでどんな問題がありましたか?これは、ffmpeg(またはlibav)によって提供される一部のライブラリのみにリンクする単一のCソースファイルです。私は、Gentoo ebuildを使用して、ラジオをタイムシフトするために使用しています。 Gentooを実行している場合、ビルドは次のように簡単です。

Sudo bash -l
layman -S
layman -a salfter
echo media-video/httpsegmenter ~\* >>/etc/portage/package.accept_keywords
emerge httpsegmenter
exit

Ubuntuでは、libavutil-devとlibavformat-devの両方がインストールされていることを確認する必要があったので、ビルドは次のようになります。

Sudo apt-get install libavutil-dev libavformat-dev
git clone https://gitlab.com/salfter/httpsegmenter.git
cd httpsegmenter
make -f Makefile.txt
Sudo make -f Makefile.txt install

いったん構築されると(そしてオーディオソースのURLを取得すると)、使用方法はかなり簡単です。オーディオをストリーミングするにはcurl、ソース(多くの場合MP3)からAACにトランスコードするにはffmpeg、チャンクするにはセグメンターを使用します。

curl -m 3600 http://invalid.tld/stream | \
ffmpeg -i - -acodec libvo_aacenc -ac 1 -ab 32k -f mpegts - 2>/dev/null | \
segmenter -i - -d 20 -o ExampleStream -x ExampleStream.m3u8 2>/dev/null

これは、1時間のストリーミングオーディオ(FlashではなくMP3またはAACである必要があります)を取得し、32 kbpsモノAACにトランスコードし、HTTPライブストリーミング用にチャンクします。ウェブサーバーが提供するディレクトリにダンプしてください。

ショーが終了したら、ポッドキャストとして提供できる単一の.m4aに変換することも簡単です。

cat `ls -rt ExampleStream-*.ts` | \
ffmpeg -i - -acodec copy -absf aac_adtstoasc ExampleStream.m4a 2>/dev/null
1
salfter

これは古い質問ですが、VLCで使用しています。

## To start playing the playlist out to the encoder
cvlc -vvv playlist.m3u --sout rtp:127.0.0.1 --ttl 2

## To start the encoder
cvlc rtp://  --sout='#transcode{acodec=mp3,ab=96}:duplicate{dst=std{access=livehttp{seglen=10,splitanywhere=true,delsegs=true,numsegs=15,index=/var/www/vlctest/mystream.m3u8,index-url=http://IPANDPORT/vlctest/mystream-########.ts},mux=ts,dst=/var/www/vlctest/mystream-########.ts},select=audio}'

プレイリストファイルを別のVLCのコピーにストリーミングしないと問題が発生しました。すでにライブストリーミングソースがある場合、最初の手順はオプションです。 (ただし、「エンコーダ」部分には任意のソースを使用できます)。

0
jeremy

Windows Azureプラットフォームでメディアサービスを使用してみてください: http://mingfeiy.com/how-to-generate-http-live-streaming-hls-content-using-windows-Azure-media-services /

設定やコーディングを必要としないポータルを使用して、ビデオをHLS形式でエンコードおよびストリーミングできます。

0
Mingfei Yan

あなたの英語は大丈夫です。

あなたの欲求不満は明らかです。

Q:ここでの本当の問題は何ですか?正常に機能するHLSサーバーが必要なようですね。 Apple要件のため、正しいですか?

ここにリストされている既成の実装を使用できますか?

0
paulsm4