FFMPEG a poussé RTMP stream ne fonctionne pas sur Android & iPhone
je dois faire un semi-live-stream. J'ai utilisé le module NGINX-rtmp et j'y ai poussé du contenu via ffmpeg en utilisant:
ffmpeg -re -i content.mp4 -r 25 -f fvl "rtmp://rtmp.server.here"
Le stream fonctionne très bien lorsque je l'ouvre dans VLC de "rtmp://rtmp.serveur.ici,"
mais je dois aussi faire des applications iPhone et Android qui jouent ces flux. Et c'est ça le problème, le flux ne fonctionne pas sur Android et iPhone.
si J'utilise Wowza streaming cloud et stream to Wowza cloud au lieu du mien NGINX-rtmp server puis la même application écrite pour Android & iPhone peut lire le flux très bien.
maintenant soit nginx-rtmp ne fonctionne pas correctement, ou quoi d'autre? J'ai aussi essayé crtmpserver et la même chose se produit.
Ce que je veux atteindre: Je dois développer un système où nous pouvons monter une chaîne TV (avoir des droits pour elle) à un serveur et puis faire un site Web, android app & iPhone app afin que les consommateurs peuvent regarder la chaîne en direct.
La téléchargement de la partie j'ai un indice, probablement une carte syntoniseur TV et un logiciel de diffusion ouvert pour la diffuser au serveur. Mais la lecture en direct est nouvelle pour moi.
mise à jour: j'ai aussi utilisé ffprobe et voici la sortie. (Voir la dernière ligne)
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
mise à Jour 2: J'ai fait fonctionner mon flux en utilisant une copie sous licence de Wowza streaming server. Tout fonctionne maintenant. Mais évidemment, ce ne sera pas une option pour tout le monde, c'est pourquoi je ne suis pas poster une réponse.
3 réponses
l'utilisation du protocole RTMP est très limitée et est principalement utilisée pour l'enregistrement vidéo. Il n'y a aucune raison de l'utiliser pour la lecture car les appareils mobiles ne prennent pas en charge RTMP nativement, vous ne pensez pas que ce soit une bonne idée de Conseiller aux utilisateurs mobiles d'installer VLC ou une application similaire sur l'appareil?
Plugin NGINX-rtmp-module a été incorporé à Nginx+ pour créer un serveur de supports d'enregistrement complet à partir de Nginx en remplacement de Wowza Media Server ou implémenter HLS pour playaback via HTTP. Ce plugin peut être utilisé avec Nginx open source edition.
pour rendre votre contenu vidéo disponible sur les appareils mobiles, vous n'avez que 2 options, chacune d'elles fonctionne via HTTP (s), pas RTMP:
HTTP Live Streaming voir l'exemple:
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 voir l'exemple
location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; mp4_limit_rate on; mp4_limit_rate_after 30s; }
l'autre côté est la sécurité. Comment protéger L'URL du streaming vidéo? Les URLs prépayées sont une bonne approche, vous pouvez essayer, Voir mon exemple il y a.
Votre vidéo d'entrée utilise
H.264
avec unhigh
profil.Si vous voulez la compatibilité avec à la fois iOS et Android vous
baseline
profil. nouveaux iPhones soutienmain
ethigh
profils mais documentation Android ne mentionne quebaseline
:-c:v libx264 -profile baseline
Ne pas utiliser le natif
aac
comme codec audio, utilisezlibfdk_aac
puisqu'il s'agit de L'encodeur de la plus haute qualité Disponible pour FFmpeg, il vous aidera à produire un flux AAC valide:-c:a libfdk_aac
assurez-vous que le débit audio est pris en charge.
FLV
le format vidéo ne supporte que les taux d'échantillonnage de 11025, 22050 et 44100.-ar 44100
ffprobe
affiche un flux non supportéStream #0:1: Data: none
. Utilisezmap
pour sauter c':-map 0:0 -map 0:2
(MPEG-TS seulement) si vous utilisez un
.ts
fichier comme entrée assurez-vous de supprimer l'AAC ADTS en-tête:-bsf:a aac_adtstoasc
par exemple:
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://...
tout d'Abord, je vous suggère d'ajouter plus de détails sur le fichier (ffprobe
) de sorte qu'il peut être comparé avec le serveur de production.
Alternativement, soyez plus strict dans votre ffmpeg
commande et définit une sortie spécifique.
C'est une commande que j'utilise pour pousser RTMP vers 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
avec votre dernière mise à jour, il y a déjà une différence entre ffmpeg
sortie et le serveur: ffmpeg
crée un flux de 25fps alors que ffprobe
voit un 20fps flux.
Est-il une place dans le serveur vous définissez les autres paramètres de sortie? essayez de définir le ffmpeg
sortie en conséquence.
voir si vous changez le ffmpeg
la sortie affecte la sortie du serveur, et essayez le profil principal h264.
Concernant ffprobe
message d'erreur, si votre fichier original contient aussi 3 flux, peut-être que le serveur ne l'aime pas alors supprimez ce flux de 'données' en utilisant map
comme ceci:ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...