Подтвердить что ты не робот

HTTP Live Streaming: кошмар Linux

Я работаю над музыкальным приложением VOD на iPhone, и, благодаря рекомендациям Apple, мне нужно запустить потоковое HTTP-потоковое, чтобы быть принятым в AppStore. Но, поскольку Apple не заботится о 98% серверов на земле, они не предоставляют свои столь волшебные HTTP-потоковые потоки для Linux-систем. И с этого момента начинается кошмар.

Моя цель проста: возьмите MP3, сегментируйте его и создайте простой файл индекса .m3u8. Я googled "HTTP Live Streaming Linux" и "О, отлично, многие люди уже это сделали!"

Сначала я посетил (настолько знаменитый) пост от Carson McDonald. Результат: svn segmentate.c был старым, багги и кошмаром для компиляции (никто в этом мире не может точно определить, какую версию ffmpeg они используют!). Затем я наткнулся на автопорт git repo, но слишком плохо, есть много раздражающих рубиновых вещей, а live_segmenter.c не может принимать mp3 файлы.

Затем я искал более глубоко. Я нашел qaru.site/info/259482/..., и это именно то, что я хочу сделать. Поэтому я пошел за советом от juuni, чтобы использовать этот script (httpsegmenter). Результат: Невозможно скомпилировать что-либо, 2 дня работы и, наконец, мне удалось скомпилировать его (ffmpeg 8.1 w/httpsegmenter rev17). И нет, это нехорошо script, он принимает 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/

Этот script кодирует мой mp3 файл (он занимает 4 секунды, слишком длинный) и передает его в m3u8-сегмент, чтобы сегментировать его на 10 секунд .TS файлов.

Я тестировал этот поток с помощью Apple mediastreamvalidator на своем mac, и он сказал, что все в порядке. Так что я играл его в quicktime, но между каждыми файлами .TS осталось около 0.2 секунд.

Итак, вот моя ситуация, это кошмар, я не могу получить простой mp3-поток по протоколу HLS. Есть ли простое решение WORKING для сегментации mp3? Почему я не могу напрямую сегментировать mp3 файл в несколько mp3 файлов, например Apple mediafilesegmenter?

4b9b3361

Ответ 1

Используйте libfaac insteam libmp3lame, который устраняет перерыв 0.2 секунды.

Ответ 2

Сервис эластичного транскодера - если вам не нужно шифрование AES, просто запустите свой MP3 в ведро S3 и сделайте с ним:

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

Затем вы можете добавить поддержку CDN Cloudfront. (P.S. Я полностью ценю вашу боль, это все пространство - кошмар).

Ответ 3

Только для прямой трансляции вы должны попробовать Nginx с RTMP-модулем для этого. 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;
}

Ответ 4

Ваш английский хорошо.

Ваше разочарование очевидно.

Q: Какая реальная проблема здесь? Похоже, вам нужен только рабочий сервер HLS, правильно? Из-за требований Apple, правильно?

Можете ли вы использовать любую из готовых реализаций, перечисленных здесь:

Ответ 5

Я знаю, что это старый вопрос, но я использую это в 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, первый шаг является необязательным, если у вас уже есть источник потоковой передачи. (но вы можете использовать любой источник для части "encoder" ).

Ответ 7

Какие у вас проблемы с httpsegmenter? Это единственный исходный C файл, который связан только с некоторыми библиотеками, предоставленными ffmpeg (или libav). Я поддерживаю Ebuild Gentoo для него, поскольку я использую его для разговора по радио. Если вы используете 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 источника), использование довольно просто: скручивайте поток аудио, ffmpeg, чтобы перекодировать его из любого источника (часто MP3) в AAC и сегментатора в chunk это вверх:

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 кбит/с моно AAC и выделяет его для потоковой передачи HTTP. Попросите его сбрасывать в каталог, обслуживаемый вашим веб-сервером, и вам хорошо идти.

Как только будет сделано шоу, преобразование в один .m4a, который может быть подан как подкаст, также прост:

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