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 · 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"

Sostituisci le parole evidenziate con i tuoi valori. Il passaggio 02 spiega ogni flag.

01

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.

install
# 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.

02

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 address
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.

Cosa fa ogni flag FFmpeg nel comando
FlagCosa fa
-reLegge 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.mp4Il tuo input: un file, un dispositivo o un altro stream. Il passaggio 03 ne ha uno per ciascuno.
-c:v libx264Codifica il video in H.264, che ogni player e browser può mostrare.
-preset veryfastScambia 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 5000kMantiene 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 yuv420pIl 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 0Ferma i keyframe extra sui cambi di scena, così il ritmo di 2 secondi resta fisso.
-c:a aac -b:a 128k -ar 44100 -ac 2Audio stereo AAC a 128 kbps e 44,1 kHz. L'encoder AAC integrato di FFmpeg non richiede flag aggiuntivi.
-f flvAvvolge 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.

03

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.

file
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.

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 su macOS

L'elenco mostra ogni fotocamera e microfono con un numero. "0:0" significa fotocamera 0 e microfono 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 su Linux

Video dal dispositivo della fotocamera, audio dall'input predefinito del desktop.

linux · v4l2
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.

windows · gdigrab
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.

rtsp camera
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.

04

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.

Bitrate video e audio FFmpeg consigliati per risoluzione
ImmagineAggiungi al comandoVideoAudioUpload necessario
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

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

  1. 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.
  2. Mantieni stabile il bitrate con -maxrate e -bufsize, così una scena movimentata non può superare la tua banda in upload.
  3. 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.

05

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 · srt
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.

06

Verifica di essere in diretta e correggi ciò che non va

  1. Avvia FFmpeg e lascia aperta la finestra. Una riga di stato che continua a contare frame= e time= indica che sta inviando.
  2. 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.
  3. 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.
Problemi comuni di streaming FFmpeg e relative soluzioni
Cosa vediCosa fare
FFmpeg si ferma subito con un errore di connessione o I/OControlla 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 streamNome 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 fileHai omesso -re. Aggiungilo prima di -i.
speed= resta sotto 1xUsa un preset più veloce (superfast), una riga inferiore del passaggio 04 oppure l'encoder della tua GPU.
FFmpeg sembra funzionare ma gli spettatori hanno bufferingControlla 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 fileAggiungi -stream_loop -1 prima di -i.
07

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.

08

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.