Tutorial · FFmpeg per il video live
Tutorial di streaming FFmpeg da un comando a un canale live
Questo tutorial di streaming FFmpeg ti porta in diretta con un solo comando: FFmpeg legge il tuo file, la fotocamera o lo schermo, lo codifica in video H.264 e audio AAC e lo invia via RTMP al tuo canale Primcast.
Troverai il comando per ogni tipo di sorgente, le impostazioni dell'encoder che mantengono fluida la riproduzione per i tuoi spettatori e una versione SRT per connessioni lunghe o instabili.
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"
Sostituisci le parole evidenziate con i tuoi valori. Il passaggio 02 spiega ogni flag.
Prima di iniziare: FFmpeg e quattro valori dal tuo pannello
Ti serve FFmpeg sul computer che invia il video e le impostazioni dell'encoder del tuo canale. Entrambe richiedono un paio di minuti.
Installa FFmpeg
Usa il gestore di pacchetti del tuo sistema, poi verifica che funzioni. Qualsiasi versione recente va bene con i comandi di questa pagina.
# Windowswinget install Gyan.FFmpeg# macOS (Homebrew)brew install ffmpeg# Debian o Ubuntusudo apt install ffmpeg# verificaffmpeg -version
Copia le impostazioni dell'encoder
Accedi, apri il tuo account video e trova la scheda Live streaming. Le sue Impostazioni encoder elencano tutto ciò che serve a FFmpeg:
- Server
- Assomiglia a
rtmp://HOST:1935/APP. Il tuo host e il nome dell'applicazione. - Nome stream
- Di solito
livestream. Va alla fine dell'indirizzo. - Username
- Il tuo login di pubblicazione.
- Password
- Clicca Mostra per vederla, oppure Nuova password per sostituirla.
Se il tuo pannello mostra anche un indirizzo Server più vicino, usa quello come server. Il tuo encoder si collega così alla nostra sede più vicina (New York, Miami, San Francisco, Amsterdam o Bucarest) e lo stream prosegue verso il tuo canale sulla nostra rete. Il nome dello stream, lo username e la password restano gli stessi.
Il tuo primo stream RTMP con FFmpeg, flag per flag
Metti username e password davanti all'host, seguiti da una @, e aggiungi il nome dello stream dopo l'applicazione. Il resto del comando dice a FFmpeg come codificare.
rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream
Mantieni le virgolette attorno all'indirizzo. Se la tua password contiene @, : o /, scrivili come %40, %3A e %2F, oppure clicca Nuova password nel pannello per averne una senza.
| Flag | Cosa fa |
|---|---|
-re | Legge un file alla sua velocità di riproduzione reale. Senza, FFmpeg invia il file il più velocemente possibile e lo stream si interrompe. Omettilo per fotocamere e dispositivi di acquisizione, che già funzionano in tempo reale. |
-i input.mp4 | Il tuo input: un file, un dispositivo o un altro stream. Il passaggio 03 ne ha uno per ciascuno. |
-c:v libx264 | Codifica il video in H.264, che ogni player e browser può mostrare. |
-preset veryfast | Scambia un po' di qualità con la velocità, così il computer tiene il passo in tempo reale. Prova faster o medium se hai CPU da spendere. |
-b:v 2500k -maxrate 2500k -bufsize 5000k | Mantiene il video vicino a un costante 2.500 kbps, così lo stream non chiede mai più upload di quanto tu abbia. Il passaggio 04 ha valori per ogni risoluzione. |
-pix_fmt yuv420p | Il formato colore che telefoni, TV e browser si aspettano. |
-force_key_frames "expr:gte(t,n_forced*2)" | Un keyframe ogni 2 secondi, qualunque sia il frame rate. La riproduzione è divisa in segmenti sui keyframe, quindi questo è quello che conta di più. |
-sc_threshold 0 | Ferma i keyframe extra sui cambi di scena, così il ritmo di 2 secondi resta fisso. |
-c:a aac -b:a 128k -ar 44100 -ac 2 | Audio stereo AAC a 128 kbps e 44,1 kHz. L'encoder AAC integrato di FFmpeg non richiede flag aggiuntivi. |
-f flv | Avvolge lo stream in FLV, il formato trasportato da RTMP. |
Le guide più vecchie, inclusa la prima versione di questa pagina, aggiungono -strict experimental per AAC. FFmpeg ha rimosso l'etichetta experimental dal suo encoder AAC nella versione 3.0, quindi puoi ometterlo.
Scegli la tua sorgente: file, webcam, schermo o telecamera IP
Cambia solo la parte di input. In ogni esempio, [encoding] sta per i flag video e audio del passaggio 02, e RTMP_ADDRESS per il tuo indirizzo tra virgolette.
Trasmetti un file video con FFmpeg
Aggiungi -stream_loop -1 prima dell'input per riprodurlo in loop finché non fermi FFmpeg.
ffmpeg -re -stream_loop -1 -i video.mp4 \ [encoding] -f flv "RTMP_ADDRESS"
Webcam su Windows
Elenca prima i tuoi dispositivi, poi usa i nomi esatti che stampa.
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 su macOS
L'elenco mostra ogni fotocamera e microfono con un numero. "0:0" significa fotocamera 0 e microfono 0.
ffmpeg -f avfoundation -list_devices true -i "" ffmpeg -f avfoundation -framerate 30 \ -video_size 1280x720 -i "0:0" \ [encoding] -f flv "RTMP_ADDRESS"
Webcam su Linux
Video dal dispositivo della fotocamera, audio dall'input predefinito del desktop.
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 \ -i /dev/video0 -f pulse -i default \ [encoding] -f flv "RTMP_ADDRESS"
Il tuo schermo su Windows
Cattura l'intero desktop a 30 fotogrammi al secondo. Aggiungi un microfono con un secondo input dshow se vuoi l'audio.
ffmpeg -f gdigrab -framerate 30 -i desktop ^ [encoding] -f flv "RTMP_ADDRESS"
Telecamera IP via RTSP
Se la telecamera invia già H.264 con un intervallo di keyframe di 2 secondi (impostato nel suo menu), copia il video così com'è e codifica solo l'audio. Altrimenti usa i flag di codifica completi.
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"
Nessun microfono sulla telecamera? Sostituisci i flag audio con -an.
Gli esempi terminano le righe con \ (macOS e Linux) o ^ (Prompt dei comandi di Windows). In PowerShell, o in caso di dubbio, metti l'intero comando su una sola riga.
Impostazioni dell'encoder FFmpeg che reggono in diretta
Scegli una riga adatta alla tua velocità di upload. Lascia libero un terzo della banda in upload: se uno speed test mostra 6 Mbps, non inviare più di circa 4.
| Immagine | Aggiungi al comando | Video | Audio | Upload necessario |
|---|---|---|---|---|
| 1080p, 30 fps | -vf scale=-2:1080 -r 30 | 4500k | 128k | 7 Mbps |
| 720p, 30 fps | -vf scale=-2:720 -r 30 | 2500k | 128k | 4 Mbps |
| 480p, 30 fps | -vf scale=-2:480 -r 30 | 1200k | 96k | 2 Mbps |
Imposta -b:v e -maxrate sul valore video e -bufsize sul doppio. Il comando nel passaggio 02 è la riga 720p. I piani live a pagamento accettano fino a 5 Mbps in ingresso, sufficienti per la riga 1080p.
Tre regole che prevengono la maggior parte del buffering
- Mantieni i keyframe a intervalli fissi di 2 secondi. Un intervallo lungo o irregolare si manifesta come blocco per i tuoi spettatori e, dal tuo lato, sembra un guasto del server.
- Mantieni stabile il bitrate con
-maxratee-bufsize, così una scena movimentata non può superare la tua banda in upload. - Controlla il valore
speed=nella riga di stato di FFmpeg. Dovrebbe attestarsi su 1x. Al di sotto, il tuo computer non riesce a codificare in tempo reale.
Lascia che la GPU faccia la codifica
Se speed= scende sotto 1x, sostituisci -c:v libx264 -preset veryfast con l'encoder hardware del tuo computer. La CPU resta così libera per tutto il resto.
- GPU NVIDIA
-c:v h264_nvenc -preset p4- Grafica Intel
-c:v h264_qsv- Mac
-c:v h264_videotoolbox
Esegui ffmpeg -encoders per vedere quali sono inclusi nella tua build.
Invia invece uno stream FFmpeg SRT
SRT mantiene stabile uno stream su collegamenti lunghi o con perdite, come il Wi-Fi di una sede, un uplink mobile o un feed da un altro continente, dove RTMP tende a bloccarsi. È incluso nei piani Pro e Platinum della nostra CDN video.
La tua scheda Live streaming avrà quindi una sezione Ingest SRT con porta e passphrase dedicate. Copia il suo URL one-line e usalo come output, con MPEG-TS al posto di FLV. I flag di codifica restano invariati.
Uno stream SRT viene riprodotto con il proprio nome, quindi usa il link di riproduzione mostrato accanto, sotto Riproduzione su.
ffmpeg -re -i input.mp4 \ [encoding] \ -f mpegts \ "srt://HOST:PORT?passphrase=PASSPHRASE&pbkeylen=16"
La tua build di FFmpeg deve supportare SRT. Verifica con ffmpeg -protocols e cerca srt nell'elenco di output.
Verifica di essere in diretta e correggi ciò che non va
- Avvia FFmpeg e lascia aperta la finestra. Una riga di stato che continua a contare
frame=etime=indica che sta inviando. - Apri la scheda Live streaming. Entro 15 secondi dovrebbe indicare che sei in diretta e mostrare ciò che il tuo encoder sta inviando, vicino al tuo bitrate.
- Copia il link di riproduzione dallo stesso pannello e aprilo in VLC (Media, Apri flusso di rete) oppure esegui
ffplay "PLAYBACK_LINK". Il pannello fornisce anche un codice embed per il tuo sito web.
| Cosa vedi | Cosa fare |
|---|---|
| FFmpeg si ferma subito con un errore di connessione o I/O | Controlla host e nome applicazione lettera per lettera. Alcune reti aziendali e alberghiere bloccano la porta 1935: prova un'altra connessione. |
| Si connette, poi il server rifiuta lo stream | Nome utente o password errati, oppure la password contiene un carattere che richiede codifica. Fai clic su Nuova password, aggiorna il comando e riprova. |
speed= resta ben sopra 1x su un file | Hai omesso -re. Aggiungilo prima di -i. |
speed= resta sotto 1x | Usa un preset più veloce (superfast), una riga inferiore del passaggio 04 oppure l'encoder della tua GPU. |
| FFmpeg sembra funzionare ma gli spettatori hanno buffering | Controlla i flag dei keyframe, poi abbassa il bitrate. Il tuo upload potrebbe essere più lento di quanto pensi a quell'ora. |
| Lo stream termina quando finisce il file | Aggiungi -stream_loop -1 prima di -i. |
Domande sullo streaming FFmpeg
Come faccio a trasmettere in streaming verso un server RTMP con FFmpeg?
Codifica in H.264 e AAC, racchiudi l'output in FLV con -f flv e passa a FFmpeg l'indirizzo RTMP come ultimo argomento. Per un canale Primcast l'indirizzo è composto da server, applicazione e nome dello stream, con nome utente e password davanti all'host: rtmp://USERNAME:PASSWORD@HOST:1935/APP/livestream.
Dove trovo indirizzo del server, nome utente e password?
Nel tuo account, nella scheda Live streaming del tuo account video, sotto Impostazioni encoder. La password resta nascosta finché non fai clic su Mostra, mentre Nuova password te ne genera una nuova. Lo stream già attivo continua a funzionare e la nuova password si applica alla connessione successiva.
Serve ancora -strict experimental per l'audio AAC?
No. L'encoder AAC nativo di FFmpeg ha perso l'etichetta sperimentale in FFmpeg 3.0, pubblicato nel 2016. Il semplice -c:a aac funziona su ogni build attuale, quindi puoi togliere il flag dai comandi più vecchi.
Quale intervallo di keyframe dovrebbe usare FFmpeg per lo streaming live?
Un valore fisso di 2 secondi. Tagliamo i segmenti di riproduzione sui keyframe, quindi un intervallo più lungo o irregolare si traduce in blocchi per i tuoi spettatori. Usa -force_key_frames "expr:gte(t,n_forced*2)" con -sc_threshold 0, oppure -g impostato al doppio del tuo frame rate.
A quale bitrate dovrei trasmettere?
Circa 2.500 kbps per il 720p e 4.500 kbps per il 1080p a 30 fotogrammi al secondo, più 128 kbps di audio. Mantieni il totale entro due terzi della velocità di upload misurata, così un momento di rallentamento sulla tua linea non interrompe lo stream.
Come posso riprodurre in loop un file video 24 ore su 24 con FFmpeg?
Metti -re -stream_loop -1 prima di -i e FFmpeg ripeterà il file finché non lo fermi. Questo però tiene occupato un computer tutto il giorno. I piani a pagamento della CDN video includono canali TV 24/7 che riproducono i tuoi video dal nostro lato.
FFmpeg può codificare lo stream sulla mia GPU?
Sì. Usa h264_nvenc su una GPU NVIDIA, h264_qsv su grafica Intel o h264_videotoolbox su un Mac, al posto di libx264. I flag per keyframe e bitrate restano invariati.
Posso inviare SRT invece di RTMP?
Sì, sui piani Pro e Platinum della CDN video. Il tuo pannello ti fornisce una porta SRT e una passphrase. Usa -f mpegts e l'URL srt:// su una riga dal pannello come output.
Preferisci una finestra alla riga di comando?
Lo stesso canale funziona con qualsiasi encoder che parli RTMP. Questi tutorial usano gli stessi quattro valori.
Ti serve un canale su cui trasmettere?
Apri un canale video, incolla i tuoi valori nel comando e valuta tu stesso la qualità dell'immagine. Bloccato su un flag? La nostra chat risponde in pochi secondi e può controllare il tuo canale mentre aspetti, e una persona subentra ogni volta che lo chiedi.