android iphone nginx ffmpeg rtmp

FFMPEG empujó la transmisión RTMP que no funciona en Android y iPhone



nginx (3)

  1. Su video de entrada utiliza H.264 con un high perfil.

    Si desea compatibilidad con iOS y Android , debe utilizar el perfil de baseline . Los iPhones más nuevos admiten los perfiles main y high , pero la documentación de Android solo menciona la baseline :

    -c:v libx264 -profile baseline

  2. No use el aac nativo como codec de audio, use libfdk_aac ya que es el codificador de mayor calidad disponible para FFmpeg y lo ayudará a producir un flujo AAC válido:

    -c:a libfdk_aac

  3. Asegúrese de que la tasa de audio es compatible. El formato de video FLV solo admite frecuencias de muestreo de 11025, 22050 y 44100.

    -ar 44100

  4. El ffprobe muestra una secuencia no compatible. ffprobe Stream #0:1: Data: none . Usa el map para omitirlo:

    -map 0:0 -map 0:2

  5. (Solo MPEG-TS) Si usa un archivo .ts como entrada, asegúrese de eliminar el encabezado ATS de AAC:

    -bsf:a aac_adtstoasc

P.ej:

ffmpeg -re -i content.mp4 -map 0:0 -map 0:2 -c:v libx264 -vprofile baseline -preset ultrafast -tune zerolatency -r 25 -pix_fmt yuv420p -c:a libfdk_aac -ac 2 -ar 44100 -f flv rtmp://...

Tengo que hacer un semi-live-stream. Usé el módulo Nginx-rtmp y luego le envié contenido a través de ffmpeg usando:

ffmpeg -re -i content.mp4 -r 25 -f fvl "rtmp://rtmp.server.here"

La secuencia funciona bien cuando la abro en VLC desde "rtmp: //rtmp.server.here"

Pero también tengo que hacer aplicaciones para iPhone y Android que reproduzcan estas transmisiones. Y ese es el problema, la transmisión no funciona en Android y iPhone.

Si uso la transmisión de Wowza en la nube y en la nube de Wowza en lugar de mi propio servidor nginx-rtmp, entonces la misma aplicación escrita para Android y iPhone puede reproducir la transmisión sin problemas.

Ahora bien, nginx-rtmp no funciona bien, ¿o qué más? También he intentado crtmpserver y lo mismo sucede.

Lo que quiero lograr: tengo que desarrollar un sistema donde podamos canalizar un canal de TV (tener derechos para él) hacia un servidor y luego crear un sitio web, una aplicación de Android y una aplicación de iPhone para que los consumidores puedan ver el canal en vivo.

Tengo una idea de la parte de carga, probablemente una tarjeta sintonizadora de TV y Open Broadcast Software para transmitirla al servidor. Pero la reproducción en vivo es nueva para mí.

ACTUALIZACIÓN: También usé ffprobe y aquí está la salida. (Ver la última línea)

munir@munir-HP-ProBook-450-G2:~$ ffprobe rtmp://rtmp.server.here ffprobe version 2.6.2 Copyright (c) 2007-2015 the FFmpeg developers built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab libavutil 54. 20.100 / 54. 20.100 libavcodec 56. 26.100 / 56. 26.100 libavformat 56. 25.101 / 56. 25.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 11.102 / 5. 11.102 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 3.100 / 53. 3.100 [flv @ 0x267cc60] Stream discovered after head already parsed Last message repeated 1 times Input #0, flv, from ''rtmp://stage.funworldpk.com/live'': Metadata: Server : NGINX RTMP (github.com/arut/nginx-rtmp-module) displayWidth : 320 displayHeight : 240 fps : 20 profile : level : Duration: 00:00:00.00, start: 288.763000, bitrate: N/A Stream #0:0: Video: h264 (High), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 20 fps, 20 tbr, 1k tbn, 40 tbc Stream #0:1: Data: none Stream #0:2: Audio: aac (LC), 22050 Hz, stereo, fltp Unsupported codec with id 0 for input stream 1

Actualización 2: Conseguí que mi transmisión funcionara utilizando una copia con licencia del servidor de transmisión Wowza. Todo funciona ahora. Pero, obviamente, esta no será una opción para todos, por eso no la publico como respuesta.


El uso del protocolo RTMP es muy limitado y se utiliza principalmente para la grabación de video. No hay ninguna razón para utilizarlo para la reproducción, ya que los dispositivos móviles no admiten RTMP de forma nativa. ¿No cree que puede ser una buena idea recomendar a los usuarios móviles que instalen VLC o una aplicación similar en el dispositivo?

El nginx-rtmp-module se ha incorporado a Nginx + para hacer un servidor de medios de grabación completo de Nginx como reemplazo de Wowza Media Server o implementar HLS para reproducción a través de HTTP. Este plugin se puede utilizar con la edición de código abierto Nginx.

Para que su contenido de video esté disponible para dispositivos móviles, solo tiene 2 opciones, cada una de ellas funciona a través de HTTP (s), no RTMP:

  1. HTTP Live Streaming , ver el ejemplo:

    location / { hls; hls_fragment 5s; hls_buffers 10 10m; hls_mp4_buffer_size 1m; hls_mp4_max_buffer_size 5m; root /var/video/; }

  2. HTTP pseudo streaming , ver el ejemplo.

    location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; mp4_limit_rate on; mp4_limit_rate_after 30s; }

    El otro lado es la seguridad. ¿Cómo proteger la transmisión de video URL? Las URL previamente expiradas en el tiempo es un buen enfoque, puede probar, vea mi ejemplo there .


Primero, le sugiero que agregue más detalles sobre el archivo ( ffprobe ) para que pueda compararse con la salida del servidor.
Alternativamente, sea más estricto en su comando ffmpeg y establezca una salida específica.
Ese es un comando que utilizo para enviar RTMP a YouTube:
ffmpeg -i any_file.mp4 -strict experimental -acodec aac -ac 1 -ar 44100 -vcodec libx264 -pix_fmt yuv420p -g 30 -vb 512k -profile:v main -preset ultrafast -r 30 -f flv -s 854x480 rtmp://a.rtmp.youtube.com/live2/your-channel.stream_code

Con la última actualización, ya existe una diferencia entre la salida de ffmpeg y la del servidor: ffmpeg crea una transmisión de ffprobe fps mientras que ffprobe ve una transmisión de 20 fps.
¿Hay algún lugar en el servidor donde establezca otros parámetros de salida? intente configurar la salida ffmpeg consecuencia.

Vea si cambiar la salida de ffmpeg afecta la salida del servidor e intente ir con el perfil principal h264.

Con respecto al mensaje de error de ffprobe , si su archivo original también contiene 3 secuencias, tal vez al servidor no le guste, así que elimine esa secuencia de "Datos" usando un map como este:
ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...