2016-07-01 3 views
1

pendings 입력을 파이프 라인을 시작하는 방법 : - 2 개 라이브 입력 스트림 (RTMP)를 - 다른 RTMP 스트림나는 다음과 같은 구성으로 파이프 라인을 이제 몇 일 동안 일하고 있어요

로하고 출력하기 - 하나 컴포 지터 로가는

사이에 일부 변환기, 대기열 등이 있으면 꽤 잘 작동합니다.

하지만 내 문제는 파이프 라인이 다음 오류와 충돌, 시작할 수 있도록 RTMP 입력 중 하나가, 시작 시간에서 사용하지 못할 수 있다는 것입니다 : - 오류 : 스트림 에서 모든 데이터를 읽지 못했습니다 - 오류 : 내부 데이터 흐름 오류

두 번째 것이 아직 준비되지 않은 경우에도 첫 번째 입력으로 스트림을 시작하려면이 작업을 수행하는 올바른 방법은 무엇입니까?

동적으로 파이프 라인을 변경하고, 패드 프로브로 놀고, 오류 메시지를 듣고 ..하지만 지금까지는 작동하지 못했습니다.

감사합니다, PL

답변

0

당신은 내가 당신이 개념 대답에 확인 추측 코드를 .. 게시 didnt는 것처럼

이 실패 할 때를 제어 할 수있는 rtspsrc에 대한 몇 가지 옵션이 있습니다 - reagarding 타임 아웃 초과 또는 최대 횟수를 초과했습니다. 사람들은 (모든 경우 확실하지)입니다

retry - this may be not very useful if it deals only with ports .. 
timeout - if you want to try with UDP some longer time you can enlarge this one 
tcp-timeout - this is important, try to play with it - make it much larger 
connection-speed - maybe it will help to make smaller this one 
protocols - I have experience that for bad streams TCP was much better for me 

실제 개념 (나는 문제에 다른보기로 가져가, 전문가 아닙니다) :

두 쓰레기통 만들 수 있습니다

- 각 스트림을 . rtspsrc와 decodebin을 사용하고 모든 패드를 가질 때까지 decodebin의 출력 패드를 차단 한 다음 컴포 지터에 연결합니다.

오류가 발생하면 (모든 패드를 기다리는 단계 중에 있어야 함) 빈을 NULL 상태 (NULL이라는 GStreamer 상태를 의미 함)로 놓고 PLAYING/PAUSED를 다시 수행합니다. pad probles를 적절하게 사용하는 것 (D :)이 문제와 관련하여 코드를 게시 할 수 있습니까? 파이프를 분해하지 않도록 오류 메시지를 무시하려고 시도 할 수 있습니다.

또한 비디오 입력 만 있습니까? 아뇨, 오디오 용으로 audiomixer를 사용할 수 있습니다 .. 또한 작곡가는 glvideomixer이라고하는 훨씬 빠른 멋진 OpenGL 버전을 가지고 있습니다.하지만 다른 OpenGL 관련 문제를 소개 할 수 있습니다. 인텔 GPU를 사용한다면 아마도 안전 할 것입니다.

0

입력란에 @otopolsky 감사합니다. rtpsrc를 사용하고 있으므로 rtspsrc 등록 정보에 대한 의견이 확실하지 않습니다.

어쨌든 입력 스트림을 입력란에 넣으려는 귀하의 생각을 따르려고했습니다. 데모 코드를 위해 모든 오디오 자료를 한 쪽 입력 스트림으로 만 처리했습니다.

파이프 라인은 다음과 같다 : 파이프 라인이 재생 상태에 일단

rtmpsrc => decodebin => videoscale => videorate => capsfilter 
=> compositor.sink_0 => capsfilter => x264enc => flvmux => rtmpsink 

내가 이렇게 빈 동적 파이프 라인에 추가됩니다 보장하기 위해 빈을 구축 할 수 있습니다.

rtmpsrc => decodebin => videoscale => videorate => capsfilter 

나는 또한 설정 빈의 유령 패드, 내가 프로브를 사용하는 빈 파이프 라인 사이의 실제 링크를 수행합니다 :

빈은 두 번째 입력의 모든 요소를 ​​가지고 그런 다음
def _prob_block(self, pad, info, data): 
    pad.remove_probe(info.id) 
    src_pad = self.bin.get_static_pad('src') 
    sink_pad = self.compositor.get_request_pad('sink_1') 
    src_pad.link(sink_pad) 
    return Gst.PadProbeReturn.OK 

ghost_pad = Gst.GhostPad.new('src', self.capsfilter_video_ben.get_static_pad('src')) 
self.bin.add_pad(ghost_pad) 
ghost_pad.add_probe(Gst.PadProbeType.BLOCK_DOWNSTREAM, self._prob_block, None) 

, 나는 내 응용 프로그램이 의사 코드가이 거의 완벽하게 작동

def _activate_bin(): 
    # ... this is where I create bin along with bin elements 
    # ... and create the ghost pad (see above) 
    # Then add the bin to the pipeline 
    pipe._pipeline.add(bin) 
    bin.set_state(Gst.State.PLAYING) 

pipe = Pipeline() 
GObject.timeout_add_seconds(10, _activate_bin) 
pipe._pipeline.set_state(Gst.State.PLAYING) 

을, 파이프 라인은 공동 통과 하나 개의 입력 (sink_0)로 시작 mpositor 그리고 rtmpsink (실제로 출력 스트림을 재생할 수 있습니다). 10 초 후, 나는 bin을 파이프 라인에 추가합니다 (compositor의 pad 'sink_1'). 여기에서 다시 말하지만, 이것은 컴포지터에 두 입력을 모두 얻을 때까지 완벽하게 작동합니다. 이것은 얼어 붙기 시작하는 곳입니다.

내가 읽을 수있는 것으로부터, 대기 시간 및/또는 시계에서 올 수 있었지만 문제를 해결할 수 없었습니다. 흥미로운 점은 양쪽 입력 스트림으로 파이프 라인을 시작할 때 문제가 없다는 것입니다.

왜 다른 행동을했는지 알고 싶습니까?

관련 문제