Poradnik · FFmpeg do wideo na żywo

Poradnik streamingu FFmpeg od jednego polecenia do kanału na żywo

Ten poradnik streamingu FFmpeg uruchomi Twoją transmisję jednym poleceniem: FFmpeg odczyta plik, kamerę lub ekran, zakoduje go do wideo H.264 i dźwięku AAC, a następnie wyśle przez RTMP na Twój kanał Primcast.

Znajdziesz tu polecenie dla każdego rodzaju źródła, ustawienia kodera, które zapewniają płynne odtwarzanie u widzów, oraz wersję SRT na długie lub niestabilne połączenia.

ffmpeg · rtmp
ffmpeg -re -i input.mp4 \ -c:v libx264 -preset veryfast \ -b:v 2500k -maxrate 2500k -bufsize 5000k \ -pix_fmt yuv420p \ -force_key_frames "expr:gte(t,n_forced*2)" \ -sc_threshold 0 \ -c:a aac -b:a 128k -ar 44100 -ac 2 \ -f flv "rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream"

Zamień wyróżnione słowa na własne wartości. Krok 02 wyjaśnia każdą flagę.

01

Zanim zaczniesz: FFmpeg i cztery wartości z panelu

Potrzebujesz FFmpeg na komputerze wysyłającym wideo oraz ustawień kodera swojego kanału. Obie rzeczy zajmą kilka minut.

Zainstaluj FFmpeg

Użyj menedżera pakietów swojego systemu, a następnie sprawdź, czy działa. Każde aktualne wydanie współpracuje z poleceniami na tej stronie.

instalacja
# Windowswinget install Gyan.FFmpeg# macOS (Homebrew)brew install ffmpeg# Debian lub Ubuntusudo apt install ffmpeg# sprawdźffmpeg -version

Skopiuj ustawienia kodera

Zaloguj się, otwórz swoje konto wideo i znajdź kartę Live streaming. Jej lista Encoder settings zawiera wszystko, czego potrzebuje FFmpeg:

Serwer
Wygląda jak rtmp://HOST:1935/APP. Nazwa Twojego hosta i aplikacji.
Nazwa strumienia
Zwykle livestream. Trafia na koniec adresu.
Nazwa użytkownika
Twój login do publikowania.
Hasło
Kliknij Pokaż, aby je zobaczyć, lub Nowe hasło, aby je zastąpić.

Jeśli panel pokazuje również adres Nearest server, użyj go jako serwera. Twój koder połączy się wtedy z naszą najbliższą lokalizacją (Nowy Jork, Miami, San Francisco, Amsterdam lub Bukareszt), a strumień dotrze do Twojego kanału przez naszą sieć. Nazwa strumienia, nazwa użytkownika i hasło pozostają bez zmian.

02

Twój pierwszy strumień RTMP w FFmpeg, flaga po fladze

Umieść nazwę użytkownika i hasło przed hostem, oddziel je znakiem @, a po aplikacji dodaj nazwę strumienia. Reszta polecenia mówi FFmpeg, jak kodować.

adres rtmp
rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream

Zachowaj cudzysłowy wokół adresu. Jeśli hasło zawiera @, : lub /, zapisz je jako %40, %3A i %2F albo kliknij Nowe hasło w panelu, aby otrzymać hasło bez tych znaków.

Działanie poszczególnych flag FFmpeg w poleceniu
FlagaDziałanie
-reOdczyta plik z jego rzeczywistą prędkością odtwarzania. Bez tego FFmpeg wysyła plik tak szybko, jak potrafi, i strumień się rwie. Pomiń ją w przypadku kamer i urządzeń przechwytujących, które już działają w czasie rzeczywistym.
-i input.mp4Twoje wejście: plik, urządzenie lub inny strumień. Krok 03 zawiera po jednym dla każdego.
-c:v libx264Koduje wideo jako H.264, które potrafi wyświetlić każdy odtwarzacz i przeglądarka.
-preset veryfastPoświęca odrobinę jakości na rzecz szybkości, aby komputer nadążał w czasie rzeczywistym. Wypróbuj faster lub medium, jeśli masz zapas mocy CPU.
-b:v 2500k -maxrate 2500k -bufsize 5000kUtrzymuje wideo blisko stabilnych 2500 kbps, dzięki czemu strumień nigdy nie żąda większego uploadu, niż masz. Krok 04 zawiera wartości dla każdej rozdzielczości.
-pix_fmt yuv420pFormat kolorów oczekiwany przez telefony, telewizory i przeglądarki.
-force_key_frames "expr:gte(t,n_forced*2)"Kluczowa klatka co 2 sekundy, niezależnie od liczby klatek na sekundę. Odtwarzanie jest dzielone na segmenty na kluczowych klatkach, więc ta flaga ma największe znaczenie.
-sc_threshold 0Zatrzymuje dodatkowe kluczowe klatki przy zmianach scen, dzięki czemu rytm 2 sekund pozostaje stały.
-c:a aac -b:a 128k -ar 44100 -ac 2Dźwięk stereo AAC przy 128 kbps i 44,1 kHz. Wbudowany koder AAC w FFmpeg nie wymaga dodatkowej flagi.
-f flvOpakowuje strumień w FLV, format przenoszony przez RTMP.

Starsze poradniki, w tym pierwsza wersja tej strony, dodają -strict experimental dla AAC. FFmpeg usunął etykietę eksperymentalną ze swojego kodera AAC w wersji 3.0, więc możesz ją pominąć.

03

Wybierz źródło: plik, kamera internetowa, ekran lub kamera IP

Zmienia się tylko część wejściowa. W każdym przykładzie [encoding] oznacza flagi wideo i audio z kroku 02, a RTMP_ADDRESS Twój adres w cudzysłowie.

Streamuj plik wideo za pomocą FFmpeg

Dodaj -stream_loop -1 przed wejściem, aby odtwarzać go w pętli, dopóki nie zatrzymasz FFmpeg.

plik
ffmpeg -re -stream_loop -1 -i video.mp4 \ [encoding] -f flv "RTMP_ADDRESS"

Kamera internetowa w Windows

Najpierw wyświetl listę urządzeń, a potem użyj dokładnych nazw, które wypisze.

windows · dshow
ffmpeg -list_devices true -f dshow -i dummy
ffmpeg -f dshow -rtbufsize 256M ^ -i video="Your Camera":audio="Your Microphone" ^ [encoding] -f flv "RTMP_ADDRESS"

Kamera internetowa w macOS

Lista pokazuje każdą kamerę i mikrofon z numerem. "0:0" oznacza kamerę 0 i mikrofon 0.

macos · avfoundation
ffmpeg -f avfoundation -list_devices true -i ""
ffmpeg -f avfoundation -framerate 30 \ -video_size 1280x720 -i "0:0" \ [encoding] -f flv "RTMP_ADDRESS"

Kamera internetowa w Linux

Wideo z urządzenia kamery, dźwięk z domyślnego wejścia pulpitu.

linux · v4l2
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 \ -i /dev/video0 -f pulse -i default \ [encoding] -f flv "RTMP_ADDRESS"

Twój ekran w Windows

Przechwytuje cały pulpit przy 30 klatkach na sekundę. Dodaj mikrofon za pomocą drugiego wejścia dshow, jeśli chcesz dźwięk.

windows · gdigrab
ffmpeg -f gdigrab -framerate 30 -i desktop ^ [encoding] -f flv "RTMP_ADDRESS"

Kamera IP przez RTSP

Jeśli kamera już wysyła H.264 z 2-sekundowym interwałem kluczowych klatek (ustawionym w jej własnym menu), skopiuj wideo bez zmian i zakoduj tylko dźwięk. W przeciwnym razie użyj pełnych flag kodowania.

kamera rtsp
ffmpeg -rtsp_transport tcp \ -i "rtsp://CAM_USER:CAM_PASS@192.168.1.64:554/stream1" \ -c:v copy -c:a aac -b:a 128k \ -f flv "RTMP_ADDRESS"

Kamera nie ma mikrofonu? Zastąp flagi audio przez -an.

Przykłady kończą linie znakiem \ (macOS i Linux) lub ^ (wiersz poleceń Windows). W PowerShellu lub w razie wątpliwości umieść całe polecenie w jednej linii.

04

Ustawienia kodera FFmpeg, które wytrzymują na żywo

Wybierz wiersz pasujący do prędkości wysyłania. Zostaw jedną trzecią łącza wolną: jeśli test prędkości pokazuje 6 Mbps, wysyłaj nie więcej niż około 4.

Sugerowane przepływności wideo i audio FFmpeg według rozdzielczości
ObrazDodaj do poleceniaWideoAudioWymagane wysyłanie
1080p, 30 fps-vf scale=-2:1080 -r 304500k128k7 Mbps
720p, 30 fps-vf scale=-2:720 -r 302500k128k4 Mbps
480p, 30 fps-vf scale=-2:480 -r 301200k96k2 Mbps

Ustaw -b:v i -maxrate na wartość wideo, a -bufsize na dwukrotność tej wartości. Polecenie w kroku 02 to wiersz 720p. Płatne plany transmisji na żywo przyjmują do 5 Mbps na wejściu, co wystarcza dla wiersza 1080p.

Trzy zasady, które zapobiegają większości buforowania

  1. Utrzymuj klatki kluczowe w stałym odstępie 2 sekund. Długi lub zmienny odstęp objawia się u widzów jako zacięcia, a z twojej strony wygląda jak awaria serwera.
  2. Utrzymuj stałą przepływność za pomocą -maxrate i -bufsize, aby ruchliwa scena nie przekroczyła twojego łącza wysyłania.
  3. Obserwuj wartość speed= w wierszu statusu FFmpeg. Powinna wynosić 1x. Poniżej tego komputer nie koduje w czasie rzeczywistym.

Pozwól GPU kodować

Jeśli speed= spada poniżej 1x, zamień -c:v libx264 -preset veryfast na sprzętowy koder dostępny w twoim komputerze. Procesor pozostaje wtedy wolny dla pozostałych zadań.

GPU NVIDIA
-c:v h264_nvenc -preset p4
Grafika Intel
-c:v h264_qsv
Mac
-c:v h264_videotoolbox

Uruchom ffmpeg -encoders, aby zobaczyć, które kodery zawiera twoja kompilacja.

05

Wyślij zamiast tego strumień FFmpeg SRT

SRT utrzymuje stabilny strumień na długich lub zawodnych łączach, takich jak Wi-Fi w obiekcie, mobilne łącze wysyłania lub transmisja z innego kontynentu, gdzie RTMP często się zacina. Jest dostępny w planach Pro i Platinum naszego wideo CDN.

Twoja karta transmisji na żywo ma wtedy sekcję SRT ingest z własnym portem i hasłem. Skopiuj jej One-line URL i użyj go jako wyjścia, z MPEG-TS zamiast FLV. Flagi kodowania pozostają bez zmian.

Strumień SRT odtwarza się pod własną nazwą, więc użyj linku do odtwarzania widocznego obok, w sekcji Plays at.

ffmpeg · srt
ffmpeg -re -i input.mp4 \ [encoding] \ -f mpegts \ "srt://HOST:PORT?passphrase=PASSPHRASE&pbkeylen=16"

Twoja kompilacja FFmpeg musi obsługiwać SRT. Sprawdź za pomocą ffmpeg -protocols i poszukaj srt na liście wyjściowej.

06

Sprawdź, czy nadajesz na żywo, i napraw to, co nie działa

  1. Uruchom FFmpeg i pozostaw okno otwarte. Wiersz statusu, który stale zwiększa frame= i time=, oznacza, że trwa wysyłanie.
  2. Otwórz kartę transmisji na żywo. W ciągu 15 sekund powinna pokazać status na żywo i wyświetlić to, co wysyła twój koder, zbliżone do twojej przepływności.
  3. Skopiuj link do odtwarzania z tego samego panelu i otwórz go w VLC (Media, Otwórz strumień sieciowy) lub uruchom ffplay "PLAYBACK_LINK". Panel daje też kod osadzenia na twoją własną stronę.
Typowe problemy ze strumieniowaniem FFmpeg i ich rozwiązania
Co widziszCo zrobić
FFmpeg natychmiast się zatrzymuje z błędem połączenia lub wejścia/wyjściaSprawdź host i nazwę aplikacji litera po literze. Niektóre sieci biurowe i hotelowe blokują port 1935: spróbuj innego połączenia.
Łączy się, a potem serwer odrzuca strumieńNazwa użytkownika lub hasło są błędne albo hasło zawiera znak wymagający kodowania. Kliknij Nowe hasło, zaktualizuj polecenie i spróbuj ponownie.
speed= utrzymuje się znacznie powyżej 1x na plikuPominąłeś -re. Dodaj je przed -i.
speed= utrzymuje się poniżej 1xUżyj szybszego presetu (superfast), niższego wiersza z kroku 04 lub kodera GPU.
FFmpeg wygląda dobrze, ale widzowie buforująSprawdź flagi klatek kluczowych, a następnie obniż przepływność. Twoje łącze wysyłania może być o tej porze wolniejsze, niż myślisz.
Strumień kończy się, gdy kończy się plikDodaj -stream_loop -1 przed -i.
07

Pytania o streaming FFmpeg

Jak streamować na serwer RTMP za pomocą FFmpeg?

Zakoduj do H.264 i AAC, opakuj wyjście w FLV za pomocą -f flv i podaj FFmpeg adres RTMP jako ostatni argument. Dla kanału Primcast adres to Twój serwer, aplikacja i nazwa strumienia, z nazwą użytkownika i hasłem przed hostem: rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream.

Gdzie znajdę adres serwera, nazwę użytkownika i hasło?

Na swoim koncie, na karcie Transmisja na żywo konta wideo, w sekcji Ustawienia enkodera. Hasło pozostaje ukryte, dopóki nie klikniesz Pokaż, a Nowe hasło wygeneruje świeże. Strumień, który jest na żywo, nadal działa, a nowe hasło obowiązuje przy następnym połączeniu.

Czy nadal potrzebuję -strict experimental dla dźwięku AAC?

Nie. Własny koder AAC FFmpeg stracił etykietę eksperymentalną w FFmpeg 3.0, wydanym w 2016 roku. Zwykłe -c:a aac działa na każdej aktualnej wersji, więc możesz usunąć tę flagę ze starszych poleceń.

Jaki interwał klatek kluczowych powinien stosować FFmpeg do transmisji na żywo?

Stałe 2 sekundy. Segmenty odtwarzania tniemy na klatkach kluczowych, więc dłuższy lub zmienny interwał zamienia się w zacinanie dla widzów. Użyj -force_key_frames "expr:gte(t,n_forced*2)" z -sc_threshold 0 lub -g ustawionym na dwukrotność liczby klatek na sekundę.

Z jakim bitrate powinienem streamować?

Około 2500 kbps dla 720p i 4500 kbps dla 1080p przy 30 klatkach na sekundę, plus 128 kbps dźwięku. Utrzymuj łączną wartość na poziomie dwóch trzecich zmierzonej prędkości wysyłania, aby chwilowe spowolnienie łącza nie zatrzymało strumienia.

Jak zapętlić plik wideo przez całą dobę za pomocą FFmpeg?

Umieść -re -stream_loop -1 przed -i, a FFmpeg będzie odtwarzał plik, dopóki go nie zatrzymasz. To jednak zajmuje komputer przez cały dzień. Płatne plany wideo CDN obejmują całodobowe kanały stacji telewizyjnych, które odtwarzają Twoje filmy po naszej stronie.

Czy FFmpeg może kodować strumień na moim GPU?

Tak. Użyj h264_nvenc na GPU NVIDIA, h264_qsv na grafice Intel lub h264_videotoolbox na Macu, zamiast libx264. Flagi klatek kluczowych i bitrate pozostają takie same.

Czy mogę wysyłać SRT zamiast RTMP?

Tak, w planach wideo CDN Pro i Platinum. Panel daje Ci port SRT i hasło. Użyj -f mpegts i jednoliniowego adresu URL srt:// z panelu jako wyjścia.

08

Wolisz okno zamiast wiersza poleceń?

Ten sam kanał działa z każdym enkoderem obsługującym RTMP. Te samouczki wykorzystują te same cztery wartości.

Potrzebujesz kanału, na który możesz streamować?

Otwórz kanał wideo, wklej swoje wartości do polecenia i sam oceń obraz. Utknąłeś na jakiejś fladze? Nasz czat odpowiada w kilka sekund i może zajrzeć na Twój kanał, podczas gdy czekasz, a człowiek przejmuje rozmowę, kiedy tylko poprosisz.