즉석에서 오디오와 비디오를 생성하고 트 위치 나 유튜브와 같은 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 초 이상으로 설정하지 않으면 협조하고 싶지 않습니다. 감사!
고마워요! 나는 파이프 라인을 운영하는 것이 막힌 호출이라고 생각했다. 슬립 타이머를 추가하면 작동합니다. 이제 키 프레임 설정에 대한 불만도 없습니다. – SenorContento