Tutorial · FFmpeg pentru video live

Tutorial de streaming FFmpeg de la o comandă la un canal live

Acest tutorial de streaming FFmpeg te pune pe live cu o singură comandă: FFmpeg citește fișierul, camera sau ecranul tău, îl encodează în video H.264 și audio AAC și îl trimite prin RTMP către canalul tău Primcast.

Vei găsi comanda pentru fiecare tip de sursă, setările de encoder care mențin redarea fluidă pentru spectatorii tăi și o versiune SRT pentru conexiuni lungi sau instabile.

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"

Înlocuiește cuvintele evidențiate cu propriile tale valori. Pasul 02 explică fiecare flag.

01

Înainte să începi: FFmpeg și patru valori din panoul tău

Ai nevoie de FFmpeg pe computerul care trimite video și de setările de encoder ale canalului tău. Ambele durează câteva minute.

Instalează FFmpeg

Folosește managerul de pachete al sistemului tău, apoi verifică dacă rulează. Orice versiune curentă funcționează cu comenzile de pe această pagină.

instalare
# Windowswinget install Gyan.FFmpeg# macOS (Homebrew)brew install ffmpeg# Debian sau Ubuntusudo apt install ffmpeg# verifică-lffmpeg -version

Copiază setările de encoder

Autentifică-te, deschide contul tău video și găsește cardul Live streaming. Lista sa Setări encoder conține tot ce are nevoie FFmpeg:

Server
Arată ca rtmp://HOST:1935/APP. Gazda ta și numele aplicației.
Nume stream
De obicei livestream. Se pune la sfârșitul adresei.
Nume utilizator
Datele tale de autentificare pentru publicare.
Parolă
Dă clic pe Afișează pentru a o vedea sau pe Parolă nouă pentru a o înlocui.

Dacă panoul tău afișează și o adresă Cel mai apropiat server, folosește-o pe aceea ca server. Encoderul tău se conectează atunci la cea mai apropiată locație a noastră (New York, Miami, San Francisco, Amsterdam sau București), iar streamul călătorește mai departe către canalul tău prin rețeaua noastră. Numele streamului, numele de utilizator și parola rămân aceleași.

02

Primul tău stream RTMP cu FFmpeg, flag cu flag

Pune numele de utilizator și parola în fața gazdei, urmate de un @, și adaugă numele streamului după aplicație. Restul comenzii îi spune lui FFmpeg cum să encodeze.

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

Păstrează ghilimelele în jurul adresei. Dacă parola ta conține @, : sau /, scrie-le ca %40, %3A și %2F sau dă clic pe Parolă nouă în panou pentru una fără ele.

Ce face fiecare flag FFmpeg din comandă
FlagCe face
-reCitește un fișier la viteza sa reală de redare. Fără el, FFmpeg trimite un fișier cât de repede poate, iar streamul se întrerupe. Omite-l pentru camere și dispozitive de captură, care rulează deja în timp real.
-i input.mp4Intrarea ta: un fișier, un dispozitiv sau alt stream. Pasul 03 are câte una pentru fiecare.
-c:v libx264Encodează video ca H.264, pe care orice player și browser îl poate afișa.
-preset veryfastSchimbă puțină calitate pentru viteză, astfel încât computerul să țină pasul în timp real. Încearcă faster sau medium dacă ai CPU de rezervă.
-b:v 2500k -maxrate 2500k -bufsize 5000kMenține video aproape de un 2.500 kbps constant, astfel încât streamul să nu ceară niciodată mai mult upload decât ai. Pasul 04 are valori pentru fiecare rezoluție.
-pix_fmt yuv420pFormatul de culoare pe care îl așteaptă telefoanele, televizoarele și browserele.
-force_key_frames "expr:gte(t,n_forced*2)"Un keyframe la fiecare 2 secunde, indiferent de rata de cadre. Redarea este împărțită în segmente pe keyframes, așa că acesta contează cel mai mult.
-sc_threshold 0Oprește keyframe-urile suplimentare la schimbările de scenă, astfel încât ritmul de 2 secunde să rămână fix.
-c:a aac -b:a 128k -ar 44100 -ac 2Audio stereo AAC la 128 kbps și 44,1 kHz. Encoderul AAC încorporat al FFmpeg nu are nevoie de niciun flag suplimentar.
-f flvÎmpachetează streamul în FLV, formatul pe care îl transportă RTMP.

Ghidurile mai vechi, inclusiv prima versiune a acestei pagini, adaugă -strict experimental pentru AAC. FFmpeg a eliminat eticheta experimentală de la encoderul său AAC în versiunea 3.0, așa că o poți omite.

03

Alege-ți sursa: fișier, webcam, ecran sau cameră IP

Doar partea de intrare se schimbă. În fiecare exemplu, [encoding] reprezintă flag-urile video și audio de la pasul 02, iar RTMP_ADDRESS adresa ta între ghilimele.

Transmite un fișier video cu FFmpeg

Adaugă -stream_loop -1 înainte de intrare pentru a-l reda în buclă până când oprești FFmpeg.

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

Webcam pe Windows

Listează mai întâi dispozitivele, apoi folosește numele exacte pe care le afișează.

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"

Webcam pe macOS

Lista afișează fiecare cameră și microfon cu un număr. "0:0" înseamnă camera 0 și microfonul 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"

Webcam pe Linux

Video de la dispozitivul camerei, sunet de la intrarea implicită a desktopului tău.

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

Ecranul tău pe Windows

Capturează întregul desktop la 30 de cadre pe secundă. Adaugă un microfon cu o a doua intrare dshow dacă vrei sunet.

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

Cameră IP prin RTSP

Dacă camera trimite deja H.264 cu un interval de keyframe de 2 secunde (setat în propriul său meniu), copiază video așa cum este și encodează doar sunetul. Altfel, folosește flag-urile complete de codare.

cameră 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"

Camera nu are microfon? Înlocuiește flag-urile audio cu -an.

Exemplele termină liniile cu \ (macOS și Linux) sau ^ (Command Prompt pe Windows). În PowerShell, sau dacă ai îndoieli, pune întreaga comandă pe o singură linie.

04

Setări encoder FFmpeg care rezistă în direct

Alege un rând care se potrivește vitezei tale de upload. Lasă o treime din upload liberă: dacă un test de viteză arată 6 Mbps, trimite cel mult aproximativ 4.

Rate de biți video și audio FFmpeg sugerate pe rezoluție
ImagineAdaugă la comandăVideoAudioUpload necesar
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

Setează -b:v și -maxrate la valoarea video și -bufsize la dublul acesteia. Comanda din pasul 02 este rândul 720p. Planurile plătite de live video acceptă până la 5 Mbps la intrare, suficient pentru rândul 1080p.

Trei reguli care previn majoritatea blocajelor de buffering

  1. Menține cadrele cheie la un interval fix de 2 secunde. Un interval lung sau fluctuant apare ca blocaj pentru spectatorii tăi, iar din partea ta arată ca o defecțiune de server.
  2. Menține rata de biți constantă cu -maxrate și -bufsize, astfel încât o scenă aglomerată să nu depășească uploadul tău.
  3. Urmărește valoarea speed= din linia de stare a FFmpeg. Ar trebui să stea la 1x. Sub aceasta, computerul tău nu poate codifica în timp real.

Lasă GPU-ul tău să facă codificarea

Dacă speed= scade sub 1x, înlocuiește -c:v libx264 -preset veryfast cu encoderul hardware pe care îl are computerul tău. CPU-ul rămâne apoi liber pentru orice altceva.

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

Rulează ffmpeg -encoders pentru a vedea care sunt incluse în versiunea ta.

05

Trimite în schimb un flux FFmpeg SRT

SRT menține un flux stabil pe legături lungi sau cu pierderi, cum ar fi Wi-Fi-ul unei locații, o conexiune mobilă de upload sau un feed de pe alt continent, unde RTMP tinde să se blocheze. Este inclus în planurile Pro și Platinum ale CDN-ului nostru video.

Cardul tău de Live streaming are apoi o secțiune SRT ingest cu portul și fraza de acces proprii. Copiază URL-ul pe o singură linie și folosește-l ca ieșire, cu MPEG-TS în loc de FLV. Indicatorii de codificare rămân aceiași.

Un flux SRT se redă sub propriul nume, așa că folosește linkul de redare afișat lângă el, sub Se redă la.

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

Versiunea ta de FFmpeg trebuie să aibă suport SRT. Verifică cu ffmpeg -protocols și caută srt în lista de ieșire.

06

Verifică dacă ești live și repară ce nu merge

  1. Pornește FFmpeg și lasă fereastra deschisă. O linie de stare care continuă să numere frame= și time= înseamnă că trimite.
  2. Deschide cardul de Live streaming. În 15 secunde ar trebui să spună live și să arate ce trimite encoderul tău, aproape de rata ta de biți.
  3. Copiază linkul de redare din același panou și deschide-l în VLC (Media, Deschide flux de rețea) sau rulează ffplay "PLAYBACK_LINK". Panoul îți oferă și un cod de embed pentru propriul site.
Probleme comune de streaming FFmpeg și soluțiile lor
Ce veziCe să faci
FFmpeg se oprește imediat cu o eroare de conexiune sau I/OVerifică gazda și numele aplicației literă cu literă. Unele rețele de birou și hotel blochează portul 1935: încearcă altă conexiune.
Se conectează, apoi serverul refuză fluxulNumele de utilizator sau parola este greșită, sau parola are un caracter care necesită codificare. Dă clic pe Parolă nouă, actualizează comanda și încearcă din nou.
speed= rămâne mult peste 1x pe un fișierAi omis -re. Adaugă-l înainte de -i.
speed= rămâne sub 1xFolosește un preset mai rapid (superfast), un rând mai jos din pasul 04 sau encoderul GPU-ului tău.
FFmpeg arată bine, dar spectatorii au bufferingVerifică indicatorii cadrelor cheie, apoi scade rata de biți. Uploadul tău poate fi mai lent decât crezi la ora aceea.
Fluxul se termină când se termină fișierulAdaugă -stream_loop -1 înainte de -i.
07

Întrebări despre streaming cu FFmpeg

Cum transmit stream către un server RTMP cu FFmpeg?

Codifică în H.264 și AAC, împachetează rezultatul în FLV cu -f flv și dă-i lui FFmpeg adresa RTMP ca ultim argument. Pentru un canal Primcast, adresa este serverul, aplicația și numele streamului tău, cu numele de utilizator și parola în fața gazdei: rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream.

Unde găsesc adresa serverului, numele de utilizator și parola?

În contul tău, pe cardul Live streaming al contului video, la setările Encoder. Parola rămâne ascunsă până apeși pe Afișează, iar Parolă nouă îți generează una proaspătă. Streamul care rulează deja continuă, iar noua parolă se aplică la următoarea conexiune.

Mai am nevoie de -strict experimental pentru audio AAC?

Nu. Codificatorul AAC propriu al FFmpeg a pierdut eticheta experimentală în FFmpeg 3.0, lansat în 2016. Simplu -c:a aac funcționează pe orice build actual, așa că poți elimina flagul din comenzile mai vechi.

Ce interval de cadre cheie ar trebui să folosească FFmpeg pentru streaming live?

Un interval fix de 2 secunde. Tăiem segmentele de redare pe cadre cheie, așa că un interval mai lung sau variabil se transformă în blocaje pentru spectatorii tăi. Folosește -force_key_frames "expr:gte(t,n_forced*2)" cu -sc_threshold 0, sau -g setat la dublul ratei de cadre.

La ce bitrate ar trebui să transmit?

Aproximativ 2.500 kbps pentru 720p și 4.500 kbps pentru 1080p la 30 de cadre pe secundă, plus 128 kbps pentru audio. Menține totalul la două treimi din viteza de upload măsurată, ca un moment lent pe linia ta să nu oprească streamul.

Cum rulez în buclă un fișier video non-stop cu FFmpeg?

Pune -re -stream_loop -1 înainte de -i și FFmpeg reia fișierul până îl oprești. Asta ține însă un computer ocupat toată ziua. Planurile plătite de CDN video includ canale TV 24/7 care redau videoclipurile tale de pe partea noastră.

Poate FFmpeg să codifice streamul pe GPU-ul meu?

Da. Folosește h264_nvenc pe un GPU NVIDIA, h264_qsv pe grafica Intel sau h264_videotoolbox pe un Mac, în loc de libx264. Flagurile pentru cadre cheie și bitrate rămân aceleași.

Pot trimite SRT în loc de RTMP?

Da, pe planurile video CDN Pro și Platinum. Panoul tău îți oferă un port SRT și o frază de acces. Folosește -f mpegts și URL-ul srt:// pe o singură linie din panou ca ieșire.

08

Preferi o fereastră în locul liniei de comandă?

Același canal funcționează cu orice codificator care vorbește RTMP. Aceste tutoriale folosesc aceleași patru valori.

Ai nevoie de un canal către care să transmiți?

Deschide un canal video, inserează valorile tale în comandă și judecă singur imaginea. Te-ai blocat la un flag? Chatul nostru răspunde în câteva secunde și poate să se uite la canalul tău cât aștepți, iar o persoană preia oricând ceri.