FFMPEG empujó la transmisión RTMP que no funciona en Android y iPhone
nginx (3)
Su video de entrada utiliza
H.264
con unhigh
perfil.Si desea compatibilidad con iOS y Android , debe utilizar el perfil de
baseline
. Los iPhones más nuevos admiten los perfilesmain
yhigh
, pero la documentación de Android solo menciona labaseline
:-c:v libx264 -profile baseline
No use el
aac
nativo como codec de audio, uselibfdk_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
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
El
ffprobe
muestra una secuencia no compatible.ffprobe
Stream #0:1: Data: none
. Usa elmap
para omitirlo:-map 0:0 -map 0:2
(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:
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/; }
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 ...