2017-12-19 41 views
0

즉석에서 오디오와 비디오를 생성하고 트 위치 나 유튜브와 같은 rtmp 서버로 스트리밍 할 수있는 프로그램이나 로봇을 만들려고합니다. Gstreamer를 사용하여 비디오 및 오디오 스트림을 가져올 수 있음을 발견했습니다. 나는 또한 Gstreamer가 Python으로 라이브러리를 가지고있는 것을 발견했다. 나의 로봇은 이미 파이썬으로 작성 되었기 때문에 좋다.Python의 Gstreamer는 즉시 종료되지만 명령 줄에서는 정상적으로 작동합니다.

문제는 testvideosrc 입력으로 테스트 할 때 명령 줄에서 오디오와 비디오 모두 제대로 작동하는 명령을 만들 수 있지만 실행하려고하면 즉시 종료됩니다.

코드는 원래 내가 거기에 여분의 "싱크"를했기 때문에 스트림이 일을 얻을 수 없었다, 나는 그것이 해결하기 위해 노력 무엇의 아웃

# Command Trying to Replicate in Python 
# gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! x264enc bitrate=1000 tune=zerolatency ! queue ! flvmux name=mux ! rtmpsink location='rtmp://live.twitch.tv/app/STREAM_KEY_HERE' audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux. 

# ORIGINAL (UNEDITED) COMMAND - gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! x264enc bitrate=1000 tune=zerolatency ! video/x-h264 ! h264parse ! video/x-h264 ! queue ! flvmux name=mux ! rtmpsink location='rtmp://live.twitch.tv/app/STREAM_KEY_HERE' audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux. 

STREAM_URL = "rtmp://REDACTED" 

# For StackExchange - gst-launch-1.0 videotestsrc is-live=true ! autovideoconvert ! x264enc bitrate=1000 tune=zerolatency ! queue ! flvmux name=mux ! rtmpsink location='rtmp://live.twitch.tv/app/STREAM_KEY_HERE' audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 

# Imports 
import gi 
import time 
from gi.repository import GObject, Gst 
import os 

# OS Variables and Requirements 
gi.require_version('Gst', '1.0') 
os.environ["GST_DEBUG"] = "4" # Enable Debug 

# Initialize GStreamer 
Gst.init(None) # gst-launch-1.0 ! 
pipeline = Gst.Pipeline() 

# Create Video Source (Video Test Source) 
videosrc = Gst.ElementFactory.make("videotestsrc") # videotestsrc is-live=true ! 
#videosrc.set_property('pattern', 18) 
videosrc.set_property('is-live', True) 
pipeline.add(videosrc) 

# Convert Video (to x264enc?) 
videoconvert = Gst.ElementFactory.make('autovideoconvert') # videoconvert 
pipeline.add(videoconvert) 

# IDK 
idk = Gst.ElementFactory.make("x264enc") # x264enc bitrate=1000 tune=zerolatency 
idk.set_property('bitrate', 1000) 
idk.set_property('tune', 'zerolatency') 
pipeline.add(idk) 

# Queue Data 
queueRTMP = Gst.ElementFactory.make("queue") # queue 
pipeline.add(queueRTMP) 

# Convert to Mux 
flvmux = Gst.ElementFactory.make("flvmux", "mux") # flvmux name=mux 
pipeline.add(flvmux) 

# Stream to RTMP Server 
rtmpsink = Gst.ElementFactory.make("rtmpsink") # rtmpsink location='rtmp://live.twitch.tv/app/STREAM_KEY_HERE' 
rtmpsink.set_property("location", STREAM_URL) 
pipeline.add(rtmpsink) 

# audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux. 

videosrc.link(videoconvert) 
videoconvert.link(idk) 
idk.link(queueRTMP) 
queueRTMP.link(flvmux) 
flvmux.link(rtmpsink) 

pipeline.set_state(Gst.State.PLAYING) 

입니다. 이 파일과 "sink"문제가있는 유일한 차이점은 "autovideoconvert"가 "videoconvert"라는 점입니다. 이 명령은 명령 행에서 실행할 때 잘 작동합니다.

싱크 문제 오류 메시지 :

0:00:00.038202264 25199  0x272a370 INFO  GST_ELEMENT_PADS gstelement.c:892:gst_element_get_static_pad: no such pad 'sink' in element "videotestsrc0" 

지금, "autovideoconvert"을 갖는 오류 메시지가 없습니다. 대신 스트림이 재생 상태에 있어도 프로그램이 종료됩니다.

0:00:00.039500044 25214  0x2568d40 INFO    GST_PADS gstpad.c:2388:gst_pad_link_full: linked videoconvert0:src and '':sink_internal, successful 

로그에 표시 마지막 상태 변경 메시지는 아래와 같다 :

0:00:00.043316535 25214  0x2568d40 INFO    GST_STATES gstelement.c:2328:gst_element_continue_state:<videoscale0> completed state change to PLAYING 
0:00:00.043341987 25214  0x2568d40 INFO    GST_STATES gstelement.c:2233:_priv_gst_element_state_changed:<videoscale0> notifying about state-changed PAUSED to PLAYING (VOID_PENDING pending) 

이들은 모두

싱크 문제는 로그에서이 메시지를 해결하기 위해 도시 로그 레벨이 4로 설정되면 이해할 수 없습니다. 명령을 작동시키기 위해 내가 잘못하고있는 것은 무엇이 겠지만 Python 버전의 명령은 아닙니다. 키 프레임 간격을 변경하는 방법을 알고있는 사람은 보너스입니다. Youtube는 4 초 이상으로 설정하지 않으면 협조하고 싶지 않습니다. 감사!

답변

0
  1. 패드의 오류가 분명해 보입니다. pipleline을 보지 않고 올바른 경우 - no such pad 'sink' in element "videotestsrc0" : 이렇게하면 src 요소가 싱크되지 않지만 src 요소가됩니다. 그리고 자연적으로 이것들은 소스 인 것처럼 싱크 패드를 가지고 있지 않습니다.

  2. 나머지 앱의 모양을 알 수 없습니다. 그러나 파이프 라인을 "실행"하는 것은 비 차단 호출입니다. 따라서 적절한 애플리케이션 루프가 없거나 다른 방법으로 통화를 기다리는 경우 애플리케이션이 즉시 종료 될 수 있습니다.

  3. x264enc key-int-max=<max-number-of-frames>. 또는 idk.set_property('key-int-max', 60).

+0

고마워요! 나는 파이프 라인을 운영하는 것이 막힌 호출이라고 생각했다. 슬립 타이머를 추가하면 작동합니다. 이제 키 프레임 설정에 대한 불만도 없습니다. – SenorContento