2012-07-25 60 views
17

ffmpeg maneja la transmisión RTMP como entrada o salida, y está funcionando bien.El uso de FFMPEG para transmitir continuamente archivos de videos a un servidor RTMP

Quiero transmitir algunos videos (una lista de reproducción dinámica administrada por un script python) a un servidor RTMP, y actualmente estoy haciendo algo bastante simple: transmitir mis videos uno por uno con FFMPEG al servidor RTMP, sin embargo causa un corte de conexión cada vez que finaliza un video, y la transmisión está lista para comenzar cuando comienza el siguiente video.

Me gustaría transmitir esos videos sin interrupciones de conexión de forma continua, luego la transmisión se puede ver correctamente.

que utiliza este comando para transmitir mis videos uno por uno para el servidor

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" 

busqué algunas soluciones a través de Internet durante muchos días, y me encontré con algunas personas que hablan sobre el uso de una tubería con nombre como entrada en ffmpeg, lo probé y no funcionó bien, ya que ffmpeg no solo cierra la transmisión RTMP cuando llega un nuevo video, sino que también se cierra.

¿Hay alguna manera de hacer esto? (Transmitir una lista de reproducción dinámica de vídeos con ffmpeg al servidor RTMP sin conexión se interrumpe

+1

Usar una tubería con nombre es el camino correcto a seguir. ¿Puedes explicar cómo eso no funcionó para ti? – blahdiblah

+0

@blahdiblah Utilicé la tubería con nombre como una entrada en ffmpeg, ffmpeg pausa y espero algunos datos de la tubería, luego probé 'cat video.mp4> fifo' y ffmpeg comencé la transmisión y salí luego de transmitir el video. Creo que no sé cómo usar el tubo con nombre de la manera correcta, cuando lo hice 'cat video1.mp4 video2.mp4> fifo' ffmpeg muestra el error' stream 4, offset 0x1d83c: partial file' después de la transmisión del primer video. Sé que soy yo quien lo está haciendo mal, tengo que pasar los datos de video de manera adecuada a través de la tubería. – KKetch

+1

Logré transmitir una lista de reproducción estática de videos usando para cada video una tubería (ex vid1.mp4 -> pipe1, vid2.mp4 -> pipe2, etc.). Luego escribo en un solo flujo llamado pipe "stream" de esta manera 'cat pipe1 pipe2 pipe3> stream', y utilizo el canal de flujo como entrada en FFMPEG para publicar mi stream, pero como busco una lista de reproducción dinámica ** cómo puedo ¿Envío más videos a la tubería de "transmisión" para mantener viva la corriente? ** Todavía no lo he resuelto. (Nota, a excepción del primer video, tuve que cortar los metadatos de cada archivo de video usando el comando tail para que esto funcione) – KKetch

Respuesta

6

actualización (ya que no puedo eliminar la respuesta aceptada): la solución adecuada es implementar un demultiplexor personalizada, similar a la concat uno. no tenemos otra manera limpia. Usted tiene que ensuciarse las manos y el código!

a continuación es un truco feo. Esta es una muy mala manera de hacerlo, simplemente no lo hacen!

La solución utiliza el concat demuxer y asume todos sus medios de origen fil es utilizar el mismo códec. El ejemplo se basa en MPEG-TS, pero lo mismo se puede hacer para RTMP.

  1. hacer un archivo de lista de reproducción sosteniendo una enorme lista de puntos de entrada para usted lista de reproducción dinámica con el siguiente formato:

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

    Estos archivos son sólo marcadores de posición.

  2. hacer un script que realiza un seguimiento de ustedes índice de lista de reproducción actual y crea enlaces simbólicos sobre la marcha para 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. de empezar a jugar ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  4. consiga perseguido y llamó nombres por un administrador del sistema enojado

+0

gracias, acabo de ver tu respuesta. Lo descubrí con el comentario de hinekyle antes, incluso si no estoy interesado en este tipo de hacks ahora. – KKetch

+0

¿Puedes dar más detalles sobre lo que quieres decir con 'Hacer un script que haga un seguimiento de tu índice actual de listas de reproducción y cree enlaces simbólicos en-el- volar para current_index + 1'? ¿Para qué sirve esto? – chovy

+0

Intentando hacer lo mismo para .m3u8 24/7 stream. Pero el comando '-c copy output -f mpegts stream.m3u8' arroja un error. – chovy

0

Puede canalizar su bucle en una memoria intermedia, y desde este buffer se canaliza a la instancia de streaming.

Con cáscara que se vería así:

#!/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 

Por supuesto, se puede utilizar cualquier tipo de lazo, también bucle a través de una lista de reproducción.

  • que darse cuenta de que MPEG es un poco más estable, entonces x 264 para el flujo de entrada
  • No sé por qué, pero un mínimo de 2 hilos para la compresión MPEG funciona mejor necesidad
  • la compresión de entrada para ser más rápido que la velocidad de fotogramas de salida, por lo que tenemos lo suficientemente rápido como nueva entrada
  • Debido a la no continuar sello de tiempo tenemos que skippet y generar una nueva en la salida
  • el tamaño del búfer tienen que ser lo suficientemente grande para que el ciclo tenga tiempo suficiente para obtener el nuevo clip.

trabajo en solución basada en Python, todavía no está completo, pero salvo algunas advertencias mi flujo de marchas de prueba, varios días:

ffplayout

Este utiliza un formato XML lista de reproducción. Y la lista de reproducción es dinámica, de modo que puede editar siempre la lista de reproducción actual y cambiar pistas o agregar nuevas.

0

Necesita crear dos archivos de lista de reproducción y al final de cada archivo especifique un enlace a otro archivo.

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' 

Ahora todo lo que necesita es cambiar de forma dinámica el contenido del archivo siguiente lista de reproducción.

Cuestiones relacionadas