2012-07-25 26 views
17

ffmpeg gestisce lo streaming RTMP come input o output e funziona correttamente.Utilizzo di FFMPEG per lo streaming continuo di file video su un server RTMP

voglio per lo streaming dei video (una playlist dinamica gestita da uno script python) a un server RTMP, e sto attualmente facendo qualcosa di molto semplice: in streaming il video uno per uno con ffmpeg per il server RTMP, tuttavia questo causa una interruzione di connessione ogni volta che un video termina e lo streaming è pronto per essere avviato all'avvio del video successivo.

Mi piacerebbe trasmettere in streaming quei video senza interruzioni di connessione ininterrottamente, quindi il flusso potrebbe essere visualizzato correttamente.

Io uso questo comando per riprodurre in streaming le video uno per uno per il server

ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 \ 
-filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv \ 
"rtmp://mystreamingserver/app/streamName" 

Ho guardato per alcune soluzioni su internet per molti giorni, e ho trovato alcune persone che parlano su come utilizzare una named pipe come input in ffmpeg, ho provato e non ha funzionato bene dal ffmpeg non solo chiude lo streaming RTMP quando arriva un nuovo video ma si chiude anche da solo.

C'è un modo per farlo? (Streaming di una playlist dinamica di video con ffmpeg al server RTMP senza interruzioni di connessione

+1

L'utilizzo di una pipe denominata è la giusta direzione. Puoi approfondire come ciò non ha funzionato per te? – blahdiblah

+0

@blahdiblah Ho usato la named pipe come input in ffmpeg, ffmpeg pause e attendo alcuni dati dalla pipe, quindi ho provato 'cat video.mp4> fifo' e ffmpeg avviare lo streaming e uscire dopo lo streaming del video. Penso di non sapere come usare la named pipe nel modo giusto, quando ho fatto 'cat video1.mp4 video2.mp4> fifo' ffmpeg mostra l'errore' stream 4, offset 0x1d83c: file parziale' dopo lo streaming del primo video. So che sono io che sto sbagliando, devo passare i dati del video in modo corretto attraverso la pipa. – KKetch

+1

Sono riuscito a trasmettere in streaming una playlist statica di video utilizzando per ogni video un pipe (ex vid1.mp4 -> pipe1, vid2.mp4 -> pipe2 ecc.). Quindi scrivo in un singolo flusso chiamato pipe "stream" in questo modo 'cat pipe1 pipe2 pipe3> stream', e io uso la pipe stream come input in FFMPEG per pubblicare il mio stream, ma poiché cerco una playlist dinamica ** come può invio più video alla pipe "stream" per mantenere vivo il flusso? ** Non l'ho ancora capito. (Nota, ad eccezione del primo video, ho dovuto tagliare i metadati di ogni file video usando il comando tail per farlo funzionare) – KKetch

risposta

6

Update (come io non riesco a cancellare la risposta accettata): la soluzione corretta è quella di implementare un demuxer personalizzato, simile a concat uno. non ci sono ancora altro modo pulito. bisogna sporcarsi le mani e il codice!

di seguito è un brutto hack. Questo è un brutto modo di farlo, semplicemente non fare!

La soluzione usa il demilizzatore concate si assume tutto il file multimediale di origine es usare lo stesso codec. L'esempio è basato su MPEG-TS, ma lo stesso può essere fatto per RTMP.

  1. Fai un file di playlist in possesso di un elenco enorme di punti di ingresso per voi playlist dinamico con il seguente formato:

    file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'

    Questi file sono solo segnaposto.

  2. fare uno script che tiene traccia di voi indice playlist attuale e crea collegamenti simbolici on-the-fly per current_index + 1

    ln -s /path/to/what/to/play/next.ts item_1.ts

    ln -s /path/to/what/to/play/next.ts item_2.ts

    ln -s /path/to/what/to/play/next.ts item_3.ts

    [...]

  3. Inizia a giocare ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  4. Get inseguito e ha chiamato i nomi da un amministratore di sistema arrabbiato

+0

grazie, ho appena visto la tua risposta. Ho capito prima con un commento hinekyle, anche se non sono interessato a questo tipo di hack ora – KKetch

+0

Puoi approfondire cosa intendi con 'Crea uno script che tiene traccia dell'indice della playlist attuale e crea link simbolici sul-the- vola per current_index + 1'? A che scopo è questo? – chovy

+0

Provare a fare la stessa cosa per .m3u8 stream 24/7. Ma il comando '-c copy output -f mpegts stream.m3u8' genera un errore. – chovy

0

È possibile reindirizzare il ciclo ad un buffer, e da questo buffer si reindirizza all'istanza streaming.

In guscio sarebbe simile:

#!/bin/bash 

for i in *.mp4; do 
     ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts - 
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream 

Naturalmente è possibile utilizzare qualsiasi tipo di ciclo, anche scorrendo una playlist.

  • immagino che mpeg è un po 'più stabile, quindi x264 per il flusso di input
  • Non so perché, ma un minimo di 2 thread per la compressione MPEG funziona meglio necessità
  • la compressione di ingresso per essere più veloce del nuovo frame di output,
  • A causa del timestamp non continuo, dobbiamo saltarlo e generarne uno nuovo nell'output
  • La dimensione del buffer deve essere abbastanza grande perché il ciclo abbia tempo sufficiente per ottenere il nuovo clip.

Io lavoro sulla soluzione basata pitone, non è ancora completo, ma ad eccezione di alcune avvertenze mio flusso di test viene eseguito più giorni:

ffplayout

Questo utilizza un formato XML playlist. E la playlist è dinamica, in questo modo puoi modificare sempre la playlist corrente e cambiare le tracce o aggiungerne di nuove.

0

È necessario creare due file di playlist e alla fine di ogni file specificare un collegamento a un altro file.

list_1.txt

ffconcat version 1.0 
file 'item_1.mp4' 
file 'list_2.txt' 

list_2.txt

ffconcat version 1.0 
file 'item_2.mp4' 
file 'list_1.txt' 

Ora tutto ciò che serve è quello di modificare dinamicamente il contenuto del file di playlist successivo.

Problemi correlati