22

我正在 iPhone 上开发音乐 VOD 应用程序,并且由于 Apple 的指导方针,我必须运行 HTTP Live Streaming 才能在 AppStore 上被接受。但是,由于 Apple 并不关心地球上 98% 的服务器,因此他们没有为基于 Linux 的系统提供如此神奇的 HTTP Live Streaming Tools。从这一点开始,噩梦开始了。

我的目标很简单:获取一个 MP3,对其进行分段并生成一个简单的 .m3u8 索引文件。我搜索了“HTTP Live Streaming Linux”和“哦,太好了!很多人已经这样做了”!

首先,我访问了 Carson McDonald 的(非常有名的)帖子。结果:svn segmentate.c 是旧的、错误的和编译的噩梦(世界上没有人能准确地知道他们使用的是什么版本的 ffmpeg!)。然后我遇到了 Carson 的 git repo,但太糟糕了,有很多烦人的 ruby​​ 东西,并且 live_segmenter.c 无法获取 mp3 文件。

然后我更深入地寻找。我找到了这个 stackoverflow topic,这正是我想要做的。所以我遵循了 juuni 的建议来使用这个脚本(httpsegmenter)。结果:无法编译任何东西,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 ?为什么我不能像苹果的 mediafilesegmenter 那样直接将 mp3 文件分割成多个 mp3 文件?

4

7 回答 7

5

使用 libmp3lame 的 libfaac insteam 消除 0.2 秒的中断。

于 2012-08-10T21:55:05.563 回答
4

Elastic Transcoder Service - 如果您不需要 AES 加密,只需将您的 MP3 放入 S3 存储桶中即可:

http://aws.amazon.com/elastictranscoder/

然后,您甚至可以添加 Cloudfront CDN 支持。(PS 我完全理解你的痛苦,这整个空间是一场噩梦)。

于 2013-12-03T03:10:20.993 回答
2

仅对于实时流媒体,您应该为此尝试使用带有 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;
}
于 2013-02-14T21:25:51.503 回答
1

您在使用 httpsegmenter 时遇到了什么问题?它是一个单一的 C 源文件,仅链接到 ffmpeg(或 libav)提供的一些库。我为它维护了一个 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

这会抓取一小时的流式音频(需要是 MP3 或 AAC,而不是 Flash),将其转码为 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

你的英语很好。

你的沮丧是显而易见的。

问:这里真正的问题是什么?听起来您只需要一个正常工作的 HLS 服务器,对吗?因为苹果的要求,对吗?

您可以使用此处列出的任何现成实现:

于 2012-06-10T18:11:34.767 回答