2015-01-12 4 views
1

저는 gstreamer로 파이썬에서 스트리밍 응용 프로그램을 작성하고 있습니다.Gstreamer, (rtmpsink) 오류에서 복구하는 방법

응용 프로그램은 tee 요소를 사용하여 rtmpsink 및 filesink에 데이터를 씁니다. 이상적인 환경 (로컬 네트워크)에서는 시작 및 스트리밍이 제대로 작동하지만 예를 들어 스트리밍 서버와의 연결이 끊어지면 어떻게해야합니까?

  1. 을 적어도 내가 좋아하는 것 : 나는

    나는 아카이브에 노력하고있어 ... 파이프 라인을 실행 상태로 유지하고, 따라서 오류가 발생한 후 filesink 서면 유지하는 방법을 알아 내려고 노력하고있어 스트리밍 파트 (rtmpsink)에서 오류가 발생한 후 보관 파일 (filesink)을 유지하는 것입니다. 오류가 발생하면 여기에 백업이 있습니다.
  2. 스트리밍 서버에 수동으로 다시 연결하십시오.
  3. 가능한 경우 연결을 확인하고 스트리밍 파트 (rtmpsink)를 다시 연결하는 일부 메커니즘을 구축하십시오.

질문 (들) :

그것이 내가 할 노력하고있어 보관 할 수 있습니까?

어떻게 보관할 수 있습니까 (동적 파이프 라인/프로브/추가 요소)?

모든 설명, 예 또는 올바른 방향으로의 방향을 매우 높이 평가할 것입니다.

참고

GST 버전 : gstreamer를 1.3.90 (rtmpsink, FAAC, x264enc)
OS : 우분투 14.04 LTS
스트리밍 서버 : wowza 4.x의

테스트 응용 프로그램 (코드) :link
파이프 라인 시작 (OK) 후 :link

파이프 라인 rtmpsink 오류가 발생한 후 (데이터를 기록하지 못했습니다) :link
로그인 조각을 rtmpsink 오류가 발생한 후 (오류 데이터를 기록 할) :link

답변

1

단일 파이프 라인으로 얼마나 안정적인 시스템인지 확신 할 수 없습니다. 내가 일을 권하고 싶습니다 것은 2 단계 프로세스를 만들 수 있습니다 :

1) audio -> encode -> tee -> filesink 
          -> shmsink 

2) shmsrc -> mux -> rtmpsink 

그런 다음 두 번째 파이프 라인에 대한 래퍼 스크립트를 작성합니다. 다음은 이러한 요소를 videotestsrc와 함께 사용하는 방법의 예입니다. 대문자는 매우 중요합니다. 공유 메모리를 통해 들어오는 내용을 충분히 상세히 분석해야합니다.

gst-launch-1.0 videotestsrc! 티 이름 = t! 대기열! videoconvert! ximagesink t. ! 동영상/x-raw, 너비 = 400, 높이 = 400, 형식 = BGRA! shmsink wait-for-connection = false 소켓 경로 =/tmp/shr

gst-launch-1.0 shmsrc 소켓 경로 =/tmp/shr! video/x-raw, 너비 = 400, 높이 = 400, 형식 = BGRA, 프레임 속도 = 30/1! videoconvert! ximagesink

공유 메모리 대신 TCP/UDP를 사용하여이 방법을 시도해 볼 수도 있습니다. 내가 FAAC 플러그인이 설치되지 않은 있지만, 파이프 라인 아마 이런 식으로 뭔가 될 것이다 :

오디오 -> FAAC -> rtpmp4apay -> udpsink 호스트 = 로컬 호스트 포트 = 1919

포트 udpsrc = 1919 -> rtpmp4adepay -> mux -> rtmpsink

+0

답변 해 주셔서 감사합니다. 나는 여전히이 접근법 (shmsink/shmsrc)을 알아 내고 있으며, 2 차 프로세스 (shmsrc)와 flvmux/rtmpsink에서 많은 문제가있다. 지금까지 성공한 유일한 경우는 "...! shmsink wait-for-connection = TRUE ..."그렇지 않으면 스트리밍 헤더가 손실되고 오디오가 재생 가능하지 않습니다. 내가 이미 알고있는 사람 외에 이미 나의 문제에 대한 다른 접근법이 있습니까? (일명 슬립 프로세스는 shm src/sink 또는 tcp/udp를 사용합니다) – kpaxit

+0

AAC에 여러분을 망칠 수있는 일종의 "키 프레임"패킷이 있는지 확실하지 않습니다. 두 번째 프로세스에 "aacparse"요소를 추가하려고 시도 했습니까? 또 다른 가능성은 프로세스간에 오디오를 전송하는 간단한 인코딩을 사용하는 것입니다. 파싱을 필요로하지 않는 오디오입니다. – mpr

+0

다른 RTMP 도구를 사용하여 조사하고 싶을 수도 있습니다. 그 rtmpsink 요소는 gstreamer "plugins-bad"아래에 나열되어 있는데, 이는 문제가있는 것으로 알려져 있음을 의미합니다. 귀하의 질문에서 장애 지점이 당신과 RTMP 서버 사이에 있거나 자신의 컴퓨터에 있는지 이해하는 데 문제가 있습니다. – mpr

관련 문제