Domanda

Quando tento di creare oleodotto che usi H264 al video trasmissione, ho un po 'enorme ritardo, fino a 10 secondi per il video di trasmissione dalla mia macchina per ... la mia macchina! Questo è inaccettabile per i miei obiettivi e mi piacerebbe consultare StackOverflow su quello che (o qualcun altro) fatto di sbagliato.

Ho preso condotte dalla pagina di documentazione gstrtpbin e un po 'li modificati per utilizzare Speex:

Questa è mittente gasdotto:     #! / Bin / sh

gst-launch -v gstrtpbin name=rtpbin \
        v4l2src ! ffmpegcolorspace ! ffenc_h263 ! rtph263ppay ! rtpbin.send_rtp_sink_0 \
                  rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000                            \
                  rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5001 sync=false async=false    \
                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
        pulsesrc ! audioconvert ! audioresample  ! audio/x-raw-int,rate=16000 !    \
                  speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_1                   \
                  rtpbin.send_rtp_src_1 ! udpsink host=127.0.0.1 port=5002                            \
                  rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5003 sync=false async=false    \
                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

Ricevente gasdotto:

! / Bin / sh

gst-launch -v\
    gstrtpbin name=rtpbin                                          \
    udpsrc caps="application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)H263-1998" \
            port=5000 ! rtpbin.recv_rtp_sink_0                                \
        rtpbin. ! rtph263pdepay ! ffdec_h263 ! xvimagesink                    \
     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
    udpsrc caps="application/x-rtp,media=(string)audio, clock-rate=(int)16000, encoding-name=(string)SPEEX, encoding-params=(string)1, payload=(int)110" \
            port=5002 ! rtpbin.recv_rtp_sink_1                                \
        rtpbin. ! rtpspeexdepay ! speexdec ! audioresample ! audioconvert ! alsasink \
     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
     rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5007 sync=false async=false

Quelle condotte, una combinazione di H263 e Speex, funzionano bene abbastanza. I snap mie dita nei pressi di macchina fotografica e micropohne e poi vedo il movimento e sentire il suono allo stesso tempo.

Poi ho cambiato condutture di utilizzare H264 lungo il percorso video.

Il mittente diventa:     #! / Bin / sh

gst-launch -v gstrtpbin name=rtpbin \
        v4l2src ! ffmpegcolorspace ! x264enc bitrate=300 ! rtph264pay ! rtpbin.send_rtp_sink_0 \
                  rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000                            \
                  rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5001 sync=false async=false    \
                  udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
        pulsesrc ! audioconvert ! audioresample  ! audio/x-raw-int,rate=16000 !    \
                  speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_1                   \
                  rtpbin.send_rtp_src_1 ! udpsink host=127.0.0.1 port=5002                            \
                  rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5003 sync=false async=false    \
                  udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

E ricevitore diventa:     #! / Bin / sh

gst-launch -v\
    gstrtpbin name=rtpbin                                          \
    udpsrc caps="application/x-rtp,media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" \
            port=5000 ! rtpbin.recv_rtp_sink_0                                \
        rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink                    \
     udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
     rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
    udpsrc caps="application/x-rtp,media=(string)audio, clock-rate=(int)16000, encoding-name=(string)SPEEX, encoding-params=(string)1, payload=(int)110" \
            port=5002 ! rtpbin.recv_rtp_sink_1                                \
        rtpbin. ! rtpspeexdepay ! speexdec ! audioresample ! audioconvert ! alsasink \
     udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
     rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5007 sync=false async=false

Questo è ciò che accade in Ubuntu 10.04. Non ho notato tali enormi ritardi su Ubuntu 9.04 -. i ritardi c'era in gamma 2-3 secondi, AFAIR

È stato utile?

Soluzione

Con un po 'di aiuto da "Sharktooth" a # x264 su Freenode, ho scoperto che la versione git di supporti GST-plugins-ugly il preset "a latenza zero".

http://cgit.freedesktop.org/gstreamer/gst-plugins-ugly

ho ottimizzato il tuo esempio di set "x264enc pass = qual quantizzatore = 20 = sintonia zerolatency", e la latenza sembra rimanere al 0,7 - 0,9 secondi. Io non riesco a capire come farlo più in basso.

Altri suggerimenti

Qualcosa c'è buffering, molto probabilmente l'encoder. I dati più si deve lavorare con, la compressione più efficace che può raggiungere. Io non sono a conoscenza che encoder, ma di solito c'è un'impostazione per la quantità di buffering.

x264 predefinita tampona l'ingresso di avere più dati con cui lavorare. L'aumento di ritardo da Ubuntu 10.04 è molto probabilmente perché è stato bloccato a una vecchia versione x264, prima dell'introduzione del --mbtree e --rc-lookahead.

Questa pagina del Mewiki si può vedere come calcolare la latenza, in numero di dei telai e il seguente, su ciò che è necessario disattivare primo a ridurre la latenza:

  

Ridurre la latenza di x264 è possibile, ma riduce la qualità. Se non si desidera la latenza, impostare zerolatency --tune. Se è possibile gestire una piccola latenza (cioè meno di 1 secondo), vale la pena di sintonia le opzioni per consentire questo. Ecco una serie di passi che si possono seguire per ridurre in modo incrementale la latenza. Arresto quando la latenza è sufficientemente bassa,

     
      
  1. Iniziare con le impostazioni predefinite
  2.   
  3. Uccidere sync-lookahead
  4.   
  5. Goccia rc-lookahead a non meno di 10 ~
  6.   
  7. discussioni scendere a un valore più basso (cioè dire 6 anziché 12)
  8.   
  9. Usa a fette le discussioni
  10.   
  11. Disattiva rc-lookahead
  12.   
  13. Disattiva B-frame
  14.   
  15. Ora siete in --tune zerolatency
  16.   

Quindi, si dovrebbe prima cercare di aggiungere alla vostra linea di comando qualcosa come

sync-lookahead = 0, rc-lookahead = 10 (non sono sicuro della formattazione della riga di comando nella propria applicazione)

Questo dovrebbe radere maggior parte della latenza, ad un costo basso efficienza di compressione. Se si dispone di molti core (un quadcore con HT, per esempio), può anche valere la pena di fare il numero 4., ad un costo po 'di velocità.

Usa sintonia = zerolatency, come da consiglio Sharktooth, se questo non è ancora sufficiente.

Maggiori informazioni sull'argomento: http://x264dev.multimedia.cx/archives/249

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top