pyledriver/stream.py

77 lines
1.9 KiB
Python
Raw Normal View History

2016-12-30 02:51:56 -05:00
#! /bin/python
from auxilary import async
import gi, time
gi.require_version('Gst', '1.0')
from gi.repository import Gst
Gst.init(None)
pipe = Gst.Pipeline.new("streamer")
bus = pipe.get_bus()
vidSrc = Gst.ElementFactory.make("v4l2src", "vidSrc")
vidConv = Gst.ElementFactory.make("videoconvert", "vidConv")
vidScale = Gst.ElementFactory.make("videoscale", "vidScale")
vidClock = Gst.ElementFactory.make("clockoverlay", "vidClock")
vidEncode = Gst.ElementFactory.make("omxh264enc", "vidEncode")
vidParse = Gst.ElementFactory.make("h264parse", "vidParse")
mux = Gst.ElementFactory.make("mp4mux", "mux")
#~ sink = Gst.ElementFactory.make("tcpserversink", "sink")
sink = Gst.ElementFactory.make("filesink", "sink")
vidSrc.set_property('device', '/dev/video0')
#~ sink.set_property('host', '0.0.0.0')
#~ sink.set_property('port', 8080)
sink.set_property('location', '/home/alarm/testicle.mp4')
vidRawCaps = Gst.Caps.from_string('video/x-raw,width=320,height=240,framerate=30/1')
parseCaps = Gst.Caps.from_string('video/x-h264,stream-format=avc')
pipe.add(vidSrc, vidConv, vidScale, vidClock, vidEncode, vidParse, mux, sink)
print(vidSrc.link(vidConv))
print(vidConv.link(vidScale))
print(vidScale.link_filtered(vidClock, vidRawCaps))
print(vidClock.link(vidEncode))
print(vidEncode.link(vidParse))
print(vidParse.link_filtered(mux, parseCaps))
print(mux.link(sink))
pipe.set_state(Gst.State.PLAYING)
#~ signal.signal(signal.SIGTERM, exit())
def terminate():
pipe.set_state(Gst.State.NULL)
exit()
@async(daemon=True)
def errorHandler():
while 1:
msg = bus.timed_pop_filtered(1e18, Gst.MessageType.ERROR)
print('howdy')
print(msg.parse_error())
terminate()
@async(daemon=True)
def eosHandler():
while 1:
msg = bus.timed_pop_filtered(1e18, Gst.MessageType.EOS)
print('EOS reached')
terminate()
try:
errorHandler()
eosHandler()
while 1:
time.sleep(3600)
except KeyboardInterrupt:
pass