2012-06-10 11 views
20

Pracuję nad muzyczną aplikacją VOD na iPhone'a, a dzięki wytycznym Apple'a muszę uruchomić transmisję na żywo HTTP, aby zostać zaakceptowanym w AppStore. Ale ponieważ Apple nie dba o 98% serwerów na świecie, nie udostępnia ich tak magicznych narzędzi HTTP Streaming Live dla systemów opartych na systemie Linux. I od tego momentu zaczyna się koszmar.Transmisja na żywo HTTP: Koszmar Linuxa

Mój cel jest prosty: weź MP3, podziel go i wygeneruj prosty plik indeksu .m3u8. Przeszukałem "HTTP Live Streaming Linux" i "Świetnie, wiele osób już to zrobiło"!

Najpierw odwiedziłem the (so famous) post by Carson McDonald. Wynik: svn segmentate.c był stary, zapluskwiony i koszmar do skompilowania (Nikt na tym świecie nie potrafi określić, z której wersji ffmpeg korzystają!). Potem natknąłem się na the Carson's git repo, ale szkoda, jest wiele irytujących ruby, a live_segmenter.c nie może pobrać plików mp3.

Potem szukałem głębiej. Znalazłem this stackoverflow topic i dokładnie to chcę zrobić. Więc poszedłem za radą Juuni, aby użyć this script (httpsegmenter). Wynik: Niemożliwe do skompilowania czegokolwiek, 2 dni pracy i wreszcie udało mi się go skompilować (ffmpeg 8.1 w/httpsegmenter rev17). I nie, to nie jest dobry skrypt, wymaga plików mp3, ale wygenerowane pliki ts i plik indeksu nie mogą być odczytane przez odtwarzacz.

Następnie autor postu krisbulman, przyszedł z rozwiązaniem, a nawet dał poprawioną wersję m3u8-segmenter przez jego własną (git repo). Testuję to: nie kompiluje, nic nie robię. Więc wziąłem oryginalną wersję z johnf https://github.com/johnf/m3u8-segmenter. Udało mi się skompilować i cudem działa (nie bardzo). użyłem tego wiersza poleceń (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/ 

Ten skrypt zakodować mój plik mp3 (trwa 4 sekundy, zbyt długo) i przekazać je do M3U8-segmentacji do segmentu go w 10 sekund Pliki .TS.

Przetestowałem ten strumień za pomocą mediastreamvalidatora firmy Apple na moim komputerze Mac, i powiedziałem, że było OK. Więc zagrałem w quicktime, ale pomiędzy każdym plikiem .TS jest około 0,2 sekundy pustej!

Oto moja sytuacja, to koszmar, nie mogę uzyskać prostego strumienia mp3 w protokole HLS. Czy istnieje proste rozwiązanie WORKING umożliwiające segmentację pliku mp3? Dlaczego nie mogę bezpośrednio posegmentować pliku mp3 na wiele plików mp3, jak robi to plik mediafilesegmenter firmy Apple?

+1

Twój angielski jest w porządku, ale twój post jest długa i niespójne. Czy możesz go skondensować i skupić się na kluczowym pytaniu? –

+0

Główne pytanie brzmi: czy istnieje proste rozwiązanie, które umożliwia segmentację pliku mp3 w Debianie? – Ethan0026

+2

Cóż, to wyjaśnia ten zaskakujący acccceent. –

Odpowiedz

0

Twój angielski jest w porządku.

Twoja frustracja jest widoczna.

P: Jaki jest prawdziwy problem? Wygląda na to, że potrzebujesz działającego serwera HLS, prawda? Ze względu na wymagania Apple, poprawne?

można użyć dowolnego z gotowych implementacji wymienionych tutaj:

+0

Prawdziwe pytanie brzmi: czy istnieje proste działające rozwiązanie do segmentacji pliku mp3 w Debianie? Muszę przesyłać strumieniowo dużo minut, a gotowe rozwiązania często są płatne. Czy znasz taki, który jest całkowicie darmowy, nawet z dużym strumieniem? – Ethan0026

+0

P: Dlaczego system operacyjny Debian? Co jest nie tak z serwerem Magnetix, na przykład? Lub jakiejkolwiek innej sugerowanej alternatywy? Czy chcesz zapłacić za komercyjne rozwiązanie? – paulsm4

+0

Nie zamierzam płacić komercyjnych rozwiązań za tak proste rzeczy. Używam systemu operacyjnego Debian, ponieważ potrzebuję apache, php, mysql i garść innych narzędzi ... Nie rozumiem, dlaczego musiałbym zainstalować serwer Magnetix na tak prostą (teoretycznie) rzecz do zrobienia. – Ethan0026

5

Zastosowanie libfaac insteam z libmp3lame co eliminuje drugą przerwę 0.2.

0

wiem, jest to stara sprawa, ale używam tego w 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}' 

miałem problemy jeśli nie przesyłać plik listy odtwarzania do innej kopii VLC, pierwszy etap jest opcjonalny jeśli masz już źródło transmisji na żywo. (ale możesz użyć dowolnego źródła dla części "kodera").

2

W przypadku transmisji na żywo powinieneś wypróbować Nginx z modułem RTMP dla tego. https://github.com/arut/nginx-rtmp-module Live HLS działa całkiem nieźle, ale z buforem looooong. Jednak nie obsługuje przesyłania strumieniowego HLS na żądanie.

Kawałek module`s config np

# 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

Elastic Transcoder Service - jeśli nie trzeba szyfrowanie AES prostu wyrzucić swoje MP3 w wiaderku z S3 i być z nim zrobić:

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

Możesz wtedy dodać obsługę CloudNail CDN. (P.S. W pełni doceniam twój ból, cała ta przestrzeń jest koszmarem).

0

Jakie problemy miałeś z programem httpsegmenter? Jest to pojedynczy plik źródłowy C, który łączy się tylko z niektórymi bibliotekami dostarczonymi przez ffmpeg (lub libav). Posiadam do tego ebuild Gentoo, ponieważ używam go do transmisji radiowej w czasie. Jeśli używasz Gentoo, budynek jest tak proste, jak to:

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

na Ubuntu, musiałem się upewnić, były zarówno zainstalowany libavutil-dev i biblioteki libavformat-dev, więc build wygląda mniej więcej tak:

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 

Po zbudowaniu (i gdy mam adres URL źródła dźwięku), użycie jest dość proste: zwinąć, aby przesłać strumień audio, ffmpeg, aby transkodować go z dowolnego źródła (często MP3) do formatu AAC, a segmenter aby porwać:

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 

Spowoduje to przesłanie jednej godziny strumieniowego dźwięku (musi to być plik MP3 lub AAC, a nie Flash), transkoduje go do formatu AAC o mocy 32 kb/s i przygotowuje do transmisji strumieniowej HTTP. Niech to zrzuci do katalogu obsługiwanego przez twój serwer WWW i jesteś gotowy do pracy.

Po show zrobił, konwersja do pojedynczego .m4a, które mogą być podawane jako podcast jest prosta:

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