2017-12-19 24 views
0

で結構です。私は、Gstreamerを使用してビデオとオーディオのストリームを取り込むことができることを発見しました。また、GstreamerにはPythonでライブラリがあることがわかりました。私のロボットはPythonで既に書かれているからです。GStreamerには即座に終了しますが、私はその場でオーディオとビデオを生成し、RTMPサーバーなど単収縮やYouTubeにストリーミングできるプログラムやロボットを構築しようとしていますコマンドライン

問題であり、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) 

です。このファイルと「シンク」の問題の唯一の違いは、「自動変換」が「ビデオコンバート」であったことです。このコマンドは、コマンドラインで実行するとうまく動作します。

シンク問題エラーメッセージ:今すぐ

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バージョンではありません。誰かがキーフレームの間隔を変更する方法を知っている場合は、ボーナスです。私はそれを4秒以上に設定できない限り、YouTubeは協力したくありません。ありがとう!

答えて

0
  1. パッドのエラーは明らかです。正しい場合はピンプラインを見ずに - no such pad 'sink' in element "videotestsrc0":これはシンクではなくsrc要素です。そして当然これらはソースとしてシンクパッドを持っていません。

  2. あなたのアプリの残りの部分の様子はわかりません。しかし、パイプラインを「実行する」ことは、非ブロッキング呼び出しです。したがって、適切なアプリケーションループがない場合や、他の手段で呼び出し後に待機した場合、アプリケーションはただちに終了することがあります。

  3. x264enc key-int-max=<max-number-of-frames>。またはidk.set_property('key-int-max', 60)

+0

ありがとう!私は、パイプラインを実行することがブロッキングコールであると想定していました。スリープタイマーを追加すると機能します。また、キーフレームの設定に関する不満もなくなりました。 – SenorContento

関連する問題