Bir işlem TCP yerine UDP üzerinden iletilmeye nasıl zorlanır?


4

Video akışı elde etmek için bir Linux makinesinde ffserver işlemi gerçekleştiriyorum ffmpeg . Ancak, video akışında gecikme var. üzerinde ffserver yapılandırma dosyası Tanımlarım Port 8090.

komuta netstat -tulnap bana bunu veriyor:

root@beagleboard:/etc# netstat -tulnap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             Stat                                                                             e       PID/Program name
tcp        0      0 0.0.0.0:68                  0.0.0.0:*                   LIST                                                                             EN      654/pump
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LIST                                                                             EN      662/portmap
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LIST                                                                             EN      698/dropbear
tcp        0      0 0.0.0.0:8090                0.0.0.0:*                   LIST                                                                             EN      744/ffserver
tcp        0     52 192.168.1.104:22            192.168.1.111:10838         ESTA                                                                             BLISHED 724/dropbear
udp        0      0 0.0.0.0:514                 0.0.0.0:*                                                                                                            703/syslog-ng
udp        0      0 0.0.0.0:111                 0.0.0.0:*                                                                                                            662/portmap
udp        0      0 0.0.0.0:60628               0.0.0.0:*                                                                                                            709/avahi-daemon: r
udp        0      0 0.0.0.0:5353                0.0.0.0:*                                                                                                            709/avahi-daemon: r

Gördüğünüz gibi, ffserver işlemi iletmek için tcp protokolünü kullanıyor ve bunun video akışı gecikmesinin nedeni olduğundan şüpheleniyorum. Süreci nasıl kullanmaya veya udp protokolünü kullanmaya zorlayabilirim? Bağlantı noktasını değiştirmeli miyim?


9
tcp vs udp çok farklı bir kullanımdır ve değiştirilemez
ratchet freak

Bana UDP üzerinden aktarım yapmanın bir yolu olmadığını mı söylüyorsunuz?
dempap

4
Bu uygulama düzeyinde gerçekleşmesi gereken bir değişikliktir, harici olarak yapamazsınız.
heavyd

3
İstediğin şey FFMpeg'e Basit RTP üzerinden yayın yapmasını söyle , ayrıca "Noktadan noktaya akışı" bölümüne bakın. RTP UDP kullanabilir.
Josh

4
Bu soruya "UDP üzerinden ffmpeg akışının nasıl yapılacağı" başlığı verilmelidir.
NothingsImpossible

Yanıtlar:


22

Programın bölümlerini yeniden yazmadan, yalnızca bir programı TCP yerine UDP kullanmaya zorlayamazsınız. Bu protokoller birbirleriyle değiştirilemeyecek kadar farklıdır.

  • TCP akış yönelimlidir (alıcı her şeyi gönderenin çıktı sırasına göre sürekli bir akış olarak görür); UDP datagrama yöneliktir (her datagram ayrı bir pakette gönderilir ve hatta yeniden sıralanabilirler).

  • TCP'nin akış kontrolü vardır; bu nedenle gönderen (veya gönderenin işletim sistemi), bağlantıyı aşmadan veya diğer bağlantıları önemli ölçüde etkilemeden veri göndermesi gerektiğini tam olarak bilir. UDP bunların hiçbirini yapmıyor - kötü bir şekilde "zorlanmış" bir program bağlantı hızından bağımsız olarak saniyede gigabayt veri göndermeye başlayabilir.

  • TCP'nin yeniden iletimi vardır, bu nedenle ortada bir paket düşürülürse (örneğin, ağ aşırı yüklendiğinden veya başka sorunları varsa) yeniden gönderilir. Protokol güvenilir bir taşımaya bağlıysa ve UDP'yi geçmesi için zorlarsanız, en az bir paket kaybolur bağlanmaz bağlantı tamamen kesilebilir. (Ve paketler irade kaybol; yukarıdaki 1. ve 2. numaralı maddelere bakınız.)


1
Gönderici akış kontrolüne uymazsa bağlantı kesiliyor mu?
Jordan Doyle

1
@JordanDoyle Hayır. Bu sadece bağlantıyı yavaşlatır, çünkü alıcının ekstra paketleri düşürmesi gerekir, bu da daha sonra yeniden iletimi gerektirir.
Bakuriu

@Bakuriu ah teşekkürler. Gönderen uymazsa bir şey olur mu?
Jordan Doyle

@JordanDoyle Dediğim gibi, göndericinin tüm bağlantı kapasitesini dolduracağı için daha fazla paketin kesilmesi ve bağlantının yavaşlaması ve yavaşlaması dışında özel bir şey olmayacak. Ağdaki trafiği gereksiz yere artırıyorsunuz ve ağın tıkanmasına neden olabilirsiniz.
Bakuriu

6

Diğerlerinin de söylediği gibi, UDP ve TCP temelde farklı protokollerdir.

Ancak, eğer şart TCP yerine UDP üzerinden veri aktarımı yapmak için bir aktarma aracı kullanabilirsiniz. SoCat . Socat'ı bir TCP bağlantısı dinleyecek şekilde yapılandırabilir ve TCP akışının içeriğini UDP akışı olarak başka bir ana bilgisayara iletebilirsiniz. Diğer ana bilgisayar TCP trafiği bekliyorsa, tekrar TCP'ye dönüştürmek için oradaki rölenin başka bir örneğini kullanabilirsiniz. Bu yeniden deneme ve ack davranışını ana bilgisayardan ana bilgisayara bağlantıdan kaldırır. Yerel aktarma aracı ile yerel uygulama arasında yeniden denemeler ve bağlantılar hala geçerli olacak, ancak yerel bir geridöngü bağlantısında yeniden deneme görmeniz pek mümkün değil.

Ancak, gecikme sorununuzu çözme olasılığı düşüktür. Uygulamanız UDP yerine TCP kullanacak şekilde oluşturulmuşsa, düşürülen paketlere toleranslı olmayabilir, bu durumda bu kesmek dengesiz davranışlara neden olabilir.


3

Gerçekten yavaş bağlantılar kullanmıyorsanız, gecikme sorununuz büyük olasılıkla video kod çözücünüzdür.

Videoyu etkili bir şekilde sıkıştırmak için akıllı kodlamalar kullanmanız gerekir (bkz. Wikipedia'da bu makale ).

Tahmini kodlamalar, önceki veya sonraki görüntülerden görüntüleri temelde hesaplar. Bunun aşağıdaki etkileri vardır:

  1. Çok sayıda P karesi kullanırsanız (önceki karelerden hesaplanır), videonun görüntülenmesinden önce bir gecikme olur başlar , çünkü istemci bir sonraki tam video karesini (I-frame) beklemek zorunda. Bununla birlikte, akış oluşturulduktan sonra videoyu nispeten gecikmeden izleyebilirsiniz.

  2. B kareleri kullanırsanız (önceki ve sonraki görüntülerden hesaplanır), gerçekten çok büyük bir gecikme yaşarsınız: Ek olarak başlangıçtaki gecikme süresine ek olarak, müşteri son I den oynatmaya başlamak için bir sonraki I-karesinin beklemelidir -Frame. Bu, gecikmeye neden olur (istemci, videoyu sunucu kayıtlarından / göndermelerinden ve çoğu zaman birkaç saniyeden daha belirgin şekilde oynatır). Videoyu anında kodluyorsanız, sunucudan da bir gecikme elde edersiniz; bir sonraki I karesinin önceki I kareden başlayarak her şeyi göndermesini beklemeniz gerekir.

Kodeklerin çoğu için, B- ve P-karelerinin kullanımını ihtiyaçlarınıza göre ayarlayabilirsiniz, ancak sıkıştırma verimine karşı işlem gecikmesi var

Yeterli bant genişliğiniz varsa, B- / P-kare olmayan bir kodlayıcı kullanabilirsiniz. MJPEG

Gecikmenin diğer bir nedeni, oynatıcı tarafında tamponlama yapmaktır, bu yüzden titrek bir ağ aktarımı varsa, herhangi bir çarpıtma olmaz. Birçok video oynatıcı, arabellek boyutlarını ayarlamanıza izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.