gstreamer udp Стримингот е бавен

Работам на апликација за видеохет и имам проблеми со преносот на UDP наспроти TCP.

Кога ги користам цевководи подолу, видеото се емитува прифатливо. ( Самата апликација е во питон, но цевководи се во суштина подолу)

sender: 

gst-launch-0.10 v4l2src ! video/x-raw-yuv,width=320,height=240 ! 
    theoraenc ! oggmux ! tcpclientsink host=nnn.nnn.nnn.nnn port = 5000

receiver: 

gst-launch-0.10 tcpserversrc host=nnn.nnn.nnn.nnn port=5000 
    ! decodebin ! xvimagesink

Сепак, бидејќи оваа апликација треба да се изведува преку / преку NAT, ми треба UDP стриминг. Кога ќе го вклучам tcpserversrc на „udpsrc порта = 5000“ и tcpclientsink на „udpsink host = nnn.nnn.nnn.nnnn порта = 5000“, перформансите паѓаат до точката каде што компјутерот што прима добива една рамка на секои 5 секунди или така. (Ова се случува дури и кога двата потока се извршуваат на иста машина)

Гасоводот што испраќа го генерира следното (еднаш):

WARNING: from element /GstPipeline:pipeline0/GstUDPSink:udpsink0: 
    Internal data flow problem.
    Additional debug info:
    gstbasesink.c(3492): gst_base_sink_chain_unlocked (): /GstPipeline:pipeline0
    /GstUDPSink:udpsink0:
    Received buffer without a new-segment. Assuming timestamps start from 0.

... и гасоводот примател генерира (на секои 20 секунди или така):

WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: 
    A lot of buffers are being dropped.
    Additional debug info:
    gstbasesink.c(2739): gst_base_sink_is_too_late (): /GstPipeline:pipeline0
    /GstXvImageSink:xvimagesink0:
    There may be a timestamping problem, or this computer is too slow.

I прочитав документи и управувања, завиткани со различни параметри до удирање, сето тоа без добар ефект. Може ли некој да ме насочи кон (без сомнение очигледно) нешто што целосно не го добивам? Однапред благодарам :) знам: зошто да се тркалаш свој? Но, трпи се со мене). Следниве три датотеки содржат минимален пример: ...

Наидов на изненадувачко откритие при спроведување на идиомот за pimpl со домашен час за покажувач (знам: зошто да се тркалаш свој? Но, трпи се со мене). Следните три датотеки содржат минимален пример:

Покажувач.h:

#pragma once 

template <typename T>
class Pointer
{
public:
    Pointer(T*p=0)
        : _p(p)
    {
    }
    virtual ~Pointer()
    {
        delete _p;
    }
private:
    void operator=(const Pointer&);
    Pointer(const Pointer&);

private:
    T*_p;
};

Foo.h:

#pragma once
#include "Pointer.h"

struct Foo
{
    Foo();
    ~Foo();

private:
    void operator=(const Foo&);
    Foo(const Foo&);

private:
    Pointer<struct FooPrivate> p;
};

main.cpp:

#include "Foo.h"

int main(int argc, char* argv[])
{
    Foo foo;
    return 0;
}

Не ми пречи како изгледаат внатрешноста на Foo.cpp . Кога составувам main.cpp со MSVC 2008, ќе го добијам предупредувањето:

pointer.h(13) : warning C4150: deletion of pointer to incomplete type 'FooPrivate'; no destructor called

Предупредувањето може да се избегне со отстранување на клучниот збор виртуелен од уништувачот Поинтер.

Ова за мене нема смисла. Дали е ова предупредување легитимно, или е грешка во компајлерот MSVC? Ако е така, дали можам безбедно да го игнорирам предупредувањето?

Знам дека нема смисла во овој случај да се направи уништувачот виртуелен, но запомнете, ова е само минимален примерен пример. Мојот оригинален код е многу посложен.

5
задан Björn Pollex 28 June 2011 в 17:06
поделиться