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.

17
demandé sur BlackDivine 2015-06-02 10:44:21

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:

  1. 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/;
    }
    
  2. 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.

3
répondu Anatoly 2015-07-11 20:02:38
  1. Votre vidéo d'entrée utilise H.264 avec un high profil.

    Si vous voulez la compatibilité avec à la fois iOS et Android vous baseline profil. nouveaux iPhones soutien main et high profils mais documentation Android ne mentionne que baseline:

    -c:v libx264 -profile baseline

  2. Ne pas utiliser le natif aac comme codec audio, utilisez libfdk_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

  3. 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

  4. ffprobe affiche un flux non supporté Stream #0:1: Data: none. Utilisez map pour sauter c':

    -map 0:0 -map 0:2

  5. (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://...
1
répondu aergistal 2015-07-17 09:41:30

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 ...

0
répondu RoeeK 2015-07-17 07:24:11