22

私は iPhone で音楽 VOD アプリを作成しています。Apple のガイドラインにより、AppStore で承認されるには HTTP ライブ ストリーミングを実行する必要があります。しかし、Apple は地球上のサーバーの 98% に関心がないため、Linux ベースのシステム用の魔法のような HTTP ライブ ストリーミング ツールを提供していません。そしてここから悪夢が始まる。

私の目標は単純です: MP3 を取得し、セグメント化し、単純な .m3u8 インデックス ファイルを生成します。私は「HTTP Live Streaming Linux」と「すごい!たくさんの人がすでにそれをやっている」とグーグルで検索しました!

まず、 Carson McDonald の (とても有名な) 投稿を訪れました。結果: svn segmentate.c は古く、バグが多く、コンパイルするのは悪夢でした (この世界の誰も、使用している ffmpeg のバージョンを正確に知ることはできません!)。その後、Carson の git repoに出くわしましたが、残念なことに、迷惑な ruby​​ がたくさんあり、live_segmenter.c は mp3 ファイルを取得できません。

その後、さらに深く調べました。私はこのスタックオーバーフローのトピックを見つけました。それはまさに私がやりたいことです。したがって、このスクリプト (httpsegmenter)を使用するように、juuni からのアドバイスに従いました。結果: 何もコンパイルできず、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 を使用してこのストリームをテストしたところ、問題ないことがわかりました。だから私はそれをクイックタイムに再生しましたが、各.TSファイルの間に約0.2秒の空白があります!!

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

4

7 に答える 7

5

0.2秒のブレークを排除するlibmp3lameのlibfaacinsteamを使用します。

于 2012-08-10T21:55:05.563 に答える
2

ライブ ストリーミングのみの場合は、RTMP モジュールを使用して Nginx を試す必要があります。https://github.com/arut/nginx-rtmp-module ライブ HLS はかなりうまく機能しますが、バッファーが長すぎます。ただし、オンデマンドの 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;
}
于 2013-02-14T21:25:51.503 に答える
1

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 を使用してオーディオをストリーミングし、ffmpeg を使用してソースにあるもの (多くの場合 MP3) から AAC にトランスコードし、セグメンターを使用してチャンクアップします。

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
于 2016-03-25T20:23:23.900 に答える
0

これは古い質問であることは知っていますが、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 の別のコピーにストリーミングしなかった場合、問題が発生しました。ライブ ストリーミング ソースが既にある場合、最初のステップはオプションです。(ただし、「エンコーダー」部分には任意のソースを使用できます)。

于 2013-01-11T21:41:09.787 に答える
0

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

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

于 2013-01-18T22:47:09.487 に答える
-1

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

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

Q: ここでの本当の問題は何ですか? 稼働中の HLS サーバーが必要なだけのようですね。Apple の要件のためですよね?

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

于 2012-06-10T18:11:34.767 に答える