Strumień audio na żywo za pomocą FFMPEG

14

Próbuję przesyłać strumieniowo dźwięk na żywo za pomocą ffmpegzewnętrznego mikrofonu USB. Wykonałem ten prawie samouczek

Musiałem dostosować kilka kroków, ale w końcu udało mi się odebrać strumień mojego laptopa za pomocą tego polecenia:

ffmpeg -f oss -i /dev/dsp1 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://192.168.28.116:1234

Procesor jest prawie w 100%, mam zły dźwięk przez dwie sekundy i po niczym ... Wireshark widzę, że płyta wysyła ramki w sposób ciągły.

Czy ktoś ma pomysły na zmniejszenie zużycia procesora?

hotipsy
źródło
Możesz zastanowić się nad podkręcaniem i innym podziałem pamięci. Jeśli masz wybór kodeka, możesz uzyskać pewną poprawę poprzez zmianę. Możesz także zbadać kompresję strumienia - chociaż może to być zysk zerowy - wszystko, co zyskasz w czasie transferu, może zostać utracone podczas kompresji.
Steve Robillard,
Czy próbowałeś najpierw zapisać do pliku lokalnego? Postaram się przejść krok po kroku: 1) nagrywanie w czasie rzeczywistym do pliku falowego, 2) nagrywanie w czasie rzeczywistym do pliku mp3 3) przesyłanie strumieniowe rzeczy przez sieć
pixelistik
nie teraz. wydaje się być skomplikowane, aby zrobić wszystkie thoses kroki zamiast ręcznie z pełnym automatycznym ffmpeg ;-)
hotips
Co nagrywasz
Alex Chamberlain,
1
Próbuję zrobić ethernetowy
babyphone

Odpowiedzi:

7

Aby odpowiedzieć na konkretne pytanie, możesz zmniejszyć procesor, przesyłając arecord do ffmpeg:

arecord -f cd -D plughw:1,0 | ffmpeg -i - -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://234.5.5.5:1234

Musisz wymienić plughw: 1,0 na określoną kartę dźwiękową. Aby uzyskać informacje, patrz arecord -l. Na moim Raspie Pi spadło z ~ 95% procesora do ~ 35%.

kumar303
źródło
6

Wejście ALSA

Jedną z możliwości jest przejście przez ALSA. Komenda podobna do powyższej byłaby

ffmpeg -ac 1 -f alsa -i hw:0,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp://localhost:1234

Nie jestem pewien, jak wpłynie to na użycie procesora.

Alex Chamberlain
źródło
Próbowałem: ffmpeg -ac 1 -f alsa -i hw: 1,0 -acodec libmp3lame -ab 32k -ac 1 -re -f rtp rtp: //192.168.1.116: 1234 Ale ffmpeg ulega awarii po kilku sekundach: [alsa @ 0x7a1510] Bufor ALSA xrun. Jakieś inne pomysły?
hotipsy,
Testowałem ffmpeg -f oss -i / dev / dsp1 -ab 32k -ac 1 -re -f rtp rtp: //192.168.28.116: 1234, ale dźwięk jest bardzo zły ... opóźnienie wynosi około 6 sekund. Masz pomysł na lepsze rozwiązanie?
Hotips
1
@ si2w Myślę, że 32k dla mp3 to trochę żart. Albo to, albo wypróbuj inny kodek. Być może jedna z serii G2xx przeznaczona na telefony
Alex Chamberlain,
3

Działa to i zmniejsza użycie procesora:

ffmpeg -f alsa -i default:CARD=U0x46d0x819 -acodec mp2 -ac 1 -re -f rtp rtp://234.5.5.5:1234 2> /tmp/mylog.log &

Pamiętaj, aby zastąpić wartość domyślną: CARD = U0x46d0x819 z identyfikatorem mikrofonu (uzyskanym z arecord -l) lub możesz określić -i hw:0,0(lub dowolne urządzenie).

Miałem podobny problem - kodowanie mp3 pochłaniało ponad 90% mocy procesora i po prostu nie mogłem nadążyć za dźwiękiem - dlatego zmieniłem go na kodowanie MP2. Zużyło to około 15-18% CPU (zmierzone vi top) i płynnie przesyła do VLC w mojej sieci LAN. Stanowiłoby idealną nianie lub coś w tym rodzaju. Występuje tylko drugie opóźnienie, czyli buforowanie na końcu VLC.

Uwaga: Adres IP to adres multiemisji ([224-239] .xyz). Nie musisz celować w określone urządzenie sieciowe w sieci LAN, a router szerokopasmowy utrzyma ruch lokalny (domyślnie).

tim
źródło
2

Można znacznie zmniejszyć obciążenie procesora, zmniejszając częstotliwość próbkowania dźwięku urządzenia wejściowego ( -ar 8000 wcześniej -f alsa ) i ustawiając szybkość transmisji dźwięku kodeka na 128k ( -b:a 128k). Jak na ironię, zmniejszenie liczby kanałów ( -ac 1) wydawało się zwiększać obciążenie procesora, więc znalazłem, że to polecenie działa przy dość niskim CPU:

ffmpeg -ar 8000 -f alsa -i hw:0 -acodec mp2 -b:a 128k -f rtp rtp://other:4444

Chociaż należy pamiętać, że zależy to również od możliwości sprzętu przechwytującego, którego próbujemy użyć, oraz wersji ffmpeg / avconv.

Pierz
źródło