2013-06-17 2 views
2

디 멀티플렉싱하지 않고 데이터를 전송하는 경우 gstreamer의 udpsink를 제한 할 수있는 방법이 있습니까?gstreamer의 udpsink 전송 속도 제한하기

스트림을 멀티플렉싱해야하는 파이프가 있습니다. 내가 어떤 식 으로든 표시되지 않습니다 filesrc ! udpsink

filesrc, 큐, 또는 udpsink 옵션을 통해이를 제한 : 주요 관심사는 이것이

filesrc ! tee name=t ! tsdemux ! ffdec_h264 ! videosink t. udpsink

. sync을 사용하면 동기화 할 미디어 스트림이 없으므로 작동하지 않습니다. 따라서 해당 파이프 라인을 사용하면 데이터 수신이 가능한 udpsink를 통해 이루어 지므로 수신 udpsrc는 처리 할 수 ​​없습니다.

/** 
* Update the delay to pause the packet sending thread. 
* Calculated by dividing how many bytes (roughly) need to be sent <code>packMaxSize</code> 
* by the target bytes/sec rate to get how many seconds are needed. Then multiplying to get 
* time in milliseconds. 
*/ 
private void updateThrottle() { 
    if (targetRate > 0) 
    { 
    throttleDelay = (long)((1000.0 * packetMaxSize)/(double)targetRate); 
    if (throttleDelay < 0) { 
     throttleDelay = 0; 
    } 
    } else { 
    throttleDelay = 0; 
    } 
} 

하지만이하지 않는 것 :

우리는이 패킷 제한 방식으로 기본 요소로 appsrc를 사용하여 우리 자신의 udpsink를 작성하려고했습니다

는 (패킷 전송 방법에 thread.sleep(throttleDelay);을있다) 속도가 무엇이든 관계없이 작동합니다. 너무 느리고 하나의 프레임이 통과합니다. 너무 빨라서 1 ~ 2 명이 빠져 나옵니다. '오른쪽'속도 (500 kB/s)에서 프레임은 0.5-2 FPS로 나오지만 끔찍하게 손상되었습니다.

코드에서이 문제를 해결하는 올바른 방법입니까? gstreamer는 처리량을 제한 할 수있는 방법이 있습니까?

답변

0

아마도 당신의 전송 프로토콜로 RTP를 사용하고 싶을 것입니다. 트릭에

filesrc ! tsdemux ! tee name=t ! ffdec_h264 ! videosink t. rtph264pay mtu=1300 ! udpsink 

해야 다음 당신이 MTU 크기를 설정할 수 rtph264pay 공급, 그래서 뭔가처럼 사용하여.

+1

질문에 지정된대로 다중 파일을 통해 파일을 보낼 수 없다는 문제는 아닙니까? 나는 또한 UDP를 통해 파일 (MKV)을 가져 오려고했지만 성공적으로 할 수 없었습니다. 그래도 RTP를 사용하여 하나의 비디오 스트림을 얻을 수있었습니다. –