2015-06-02 25 views
17

Devo eseguire un semi-live-stream. Ho usato il modulo Nginx-rtmp e poi spinto i contenuti ad esso tramite ffmpeg usando:FFMPEG ha trasmesso il flusso RTMP non funzionante su Android e iPhone

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

Il flusso funziona bene quando l'ho aperto in VLC da "rtmp: //rtmp.server.here"

Ma Devo anche creare app per iPhone e Android che riproducano questi flussi. E questo è il problema, lo streaming non funziona su Android e iPhone.

Se utilizzo Wowza streaming cloud e stream su cloud Wowza invece del mio server nginx-rtmp, la stessa app scritta per Android & iPhone può riprodurre il flusso in modo corretto.

Ora nginx-rtmp non funziona correttamente oppure cos'altro? Ho anche provato crtmpserver e succede la stessa cosa.

Quello che voglio acheive: devo sviluppare un sistema in cui siamo in grado di monte di una TV-canale (disporre dei diritti per esso) a un server e poi fare un sito web, un'applicazione Android & app iPhone quindi i consumatori possono guarda il canale live.

La parte di caricamento di cui ho un indizio, probabilmente una scheda di sintonizzazione TV e Open Broadcast Software per lo streaming sul server. Ma la riproduzione dal vivo è nuova per me.


UPDATE: Ho anche usato ffprobe ed ecco l'output. (Si veda l'ultima riga)

[email protected]:~$ 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 

Aggiornamento 2: ho ottenuto il mio flusso di lavoro utilizzando copia con licenza del server di streaming Wowza. Tutto funziona ora. Ma ovviamente questa non sarà un'opzione per tutti, ecco perché non la sto postando come risposta.

+1

Puoi provare a usare 'ffprobe' per verificare se ci sono differenze di codifica tra il tuo stream e l'output di Wowza. – aergistal

+0

@aergistal Ho aggiornato la risposta con l'output ffprobe. – BlackDivine

+0

Confronta l'output 'ffprobe' per i flussi Wowza e Nginx –

risposta

2

L'utilizzo del protocollo RTMP è molto limitato e viene principalmente utilizzato per la registrazione di video. Non vi è alcun motivo per utilizzarlo per la riproduzione poiché i dispositivi mobili non supportano RTMP in modo nativo, non pensate che possa essere una buona idea consigliare agli utenti mobili di installare VLC o un'app simile sul dispositivo?

Il plug-in nginx-rtmp-module è stato incorporato in Nginx + per creare un server multimediale di registrazione completo da Nginx in sostituzione di Wowza Media Server o implementare HLS per la riproduzione tramite HTTP. Questo plugin può essere utilizzato con l'edizione open source di Nginx.

Per rendere i contenuti video disponibili per i dispositivi mobili si hanno solo 2 opzioni, ognuna di loro lavoro tramite HTTP (s), non RTMP:

  1. HTTP Live Streaming, vedere l'esempio:

    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, vedere l'esempio

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

    il l'altro lato è la sicurezza. Come proteggere l'URL di streaming video? Gli URL pre-generati scaduti sono un buon approccio, puoi provare, vedi il mio esempio there.

+0

Ho aggiornato la domanda, mi dispiace per la risposta in ritardo. Ero molto impegnato con altri lavori prioritari nella mia azienda prima. – BlackDivine

0

In primo luogo, vi consiglio di aggiungere più dettagli sul file (ffprobe) in modo che possa essere confrontato con l'output del server.
In alternativa, è più rigoroso nel comando ffmpeg e imposta un output specifico.
Questo è un comando che uso per spingere RTMP su 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 te ultimo aggiornamento, c'è già una differenza tra ffmpeg uscita e il server di: ffmpeg crea un flusso di 25fps, mentre ffprobe vede un flusso di 20fps.
C'è un posto nel server in cui si impostano altri parametri di output? prova a impostare l'uscita ffmpeg di conseguenza.

Vedere se la modifica dell'uscita ffmpeg influisce sull'output del server e provare a utilizzare il profilo principale h264.

Per quanto riguarda il messaggio di ffprobe errore, se il file originale contiene anche 3 corsi d'acqua, forse il server non piace così rimuovere quel flusso 'Dati' utilizzando map come questo:
ffmpeg -i content.mp4 -map 0:0 -map 0:2 ...

+0

Mentre i profili 'main' e' high' sono supportati sui nuovi iPhone, la documentazione di Android menziona solo il profilo 'baseline' per H.264 AVC, quindi devi andare con quello se hai bisogno di compatibilità con entrambe le piattaforme. Il codificatore predefinito 'aac' è ** NON ** consigliato (suggerimento: la parte' -strict-experimental'). L'opzione migliore per l'output AAC valido è 'libfdk_aac' – aergistal

1
  1. tuo input video utilizza H.264 con un profilo high.

    Se volete la compatibilità con sia per iOS e Android si deve utilizzare il profilo baseline. Newer iPhones sostenere i profili main e high ma l'Android documentation menzioni solo baseline:

    -c:v libx264 -profile baseline

  2. Non utilizzare il nativo aac codec come audio, utilizzare libfdk_aac dal momento che è l'encoder più alta qualità disponibile per FFmpeg e vi aiuterà si produce un flusso AAC valida:

    -c:a libfdk_aac

  3. assicurarsi la frequenza audio è supportata. Il formato FLV video supporta solo frequenze di campionamento di 11025, 22050 e 44100.

    -ar 44100

  4. Il ffprobe mostra un flusso non supportato Stream #0:1: Data: none.Utilizzare map di saltarlo:

    -map 0:0 -map 0:2

  5. (MPEG-TS) Se si utilizza un file .ts come input assicurarsi di rimuovere l'intestazione AAC ADTS:

    -bsf:a aac_adtstoasc

Es .:

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