#!/usr/bin/env python3.4
+# -*- coding: utf-8 -*-
# This file is part of ABYSS.
+# ABYSS Broadcast Your Streaming Successfully
#
# ABYSS is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
WARN = '[WARN] '
AUDIO_INPUT = 'alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00-CODEC.analog-stereo'
+AUDIO_OUTPUT = 'alsa_output.pci-0000_00_1b.0.analog-stereo'
class New_user_pipeline():
- def __init__(self, feed='main'):
+ def __init__(self, rtsp_address, feed='main'):
+ self.rtsp_address = 'rtsp://' + rtsp_address
self.feed = feed
self.user_pipeline = self.create_gstreamer_pipeline()
def create_video_sources(self):
"""Create video inputs from various sources."""
self.videosrc = Gst.ElementFactory.make('rtspsrc', 'videosrc')
- self.videosrc.set_property('location', 'rtsp://192.168.48.2:554')
+ self.videosrc.set_property('location', self.rtsp_address)
+## self.videosrc.set_property('location', 'rtsp://192.168.48.2:554')
self.videosrc.set_property('latency', 0)
## self.videosrc.set_property('debug', True)
if self.feed == 'backup':
# To local screen:
self.screensink = Gst.ElementFactory.make('xvimagesink', 'screensink')
self.screensink.set_property('sync', False)
+ # To local audio output (headphones):
+ self.audiosink = Gst.ElementFactory.make('pulsesink', 'audiosink')
+ self.audiosink.set_property('device', AUDIO_OUTPUT)
+ self.audiosink.set_property('sync', False)
# To icecast server:
self.icecastsink_audio = Gst.ElementFactory.make('shout2send', 'icecastsink_audio')
self.icecastsink_audio.set_property('sync', False)
# Output elements:
self.create_filesink()
self.create_streamsink()
+ if self.feed == 'test':
+ print('TEST OK...', end='')
print('created')
if self.feed == 'backup':
print (INFO,
def add_elements_to_pipeline(self):
print(INFO, gettime(), 'Pipeline creation state: adding elements... ', end='')
+ cond = self.feed != 'test'
+
# Inputs elements:
self.streampipe.add(self.audiosrc)
# Middle elements:
self.streampipe.add(self.audiolevel)
- self.streampipe.add(self.vorbisenc)
- self.streampipe.add(self.vp8enc)
- self.streampipe.add(self.mkvmux)
- self.streampipe.add(self.oggmux)
- self.streampipe.add(self.webmmux)
- self.streampipe.add(self.tee_rawaudio)
- self.streampipe.add(self.tee_rawvideo)
- self.streampipe.add(self.tee_streamaudio)
- self.streampipe.add(self.tee_streamfull)
- self.streampipe.add(self.queuev_2)
- self.streampipe.add(self.queuev_3)
- self.streampipe.add(self.queuev_4)
- self.streampipe.add(self.queuev_5)
self.streampipe.add(self.queuea_1)
- self.streampipe.add(self.queuea_2)
- self.streampipe.add(self.queuea_3)
- self.streampipe.add(self.queuea_4)
- self.streampipe.add(self.queuea_5)
- self.streampipe.add(self.queuem_1)
- self.streampipe.add(self.queuem_2)
+ self.streampipe.add(self.queuev_3)
+ if cond:
+ self.streampipe.add(self.vorbisenc)
+ self.streampipe.add(self.oggmux)
+ self.streampipe.add(self.queuea_2)
+ self.streampipe.add(self.queuea_3)
+ self.streampipe.add(self.vp8enc)
+ self.streampipe.add(self.mkvmux)
+ self.streampipe.add(self.webmmux)
+ self.streampipe.add(self.tee_rawaudio)
+ self.streampipe.add(self.tee_rawvideo)
+ self.streampipe.add(self.tee_streamaudio)
+ self.streampipe.add(self.tee_streamfull)
+ self.streampipe.add(self.queuev_2)
+ self.streampipe.add(self.queuev_4)
+ self.streampipe.add(self.queuev_5)
+ self.streampipe.add(self.queuea_4)
+ self.streampipe.add(self.queuea_5)
+ self.streampipe.add(self.queuem_1)
+ self.streampipe.add(self.queuem_2)
# Outputs elements:
self.streampipe.add(self.screensink)
- self.streampipe.add(self.disksink_rawvideo)
- self.streampipe.add(self.disksink_audio)
- self.streampipe.add(self.disksink_stream)
- self.streampipe.add(self.icecastsink_audio)
- self.streampipe.add(self.icecastsink_stream)
- if self.feed == 'main':
+ if cond:
+ self.streampipe.add(self.disksink_rawvideo)
+ self.streampipe.add(self.disksink_audio)
+ self.streampipe.add(self.disksink_stream)
+ self.streampipe.add(self.icecastsink_audio)
+ self.streampipe.add(self.icecastsink_stream)
+ else:
+ self.streampipe.add(self.audiosink)
+
+ if self.feed == 'main' or self.feed == 'test':
# Inputs elements:
self.streampipe.add(self.videosrc)
# Middle elements:
self.streampipe.add(self.capsfilter)
self.streampipe.add(self.tee_videodecoded)
self.streampipe.add(self.queuev_1)
+ if self.feed == 'test':
+ print ('TEST OK...', end='')
elif self.feed == 'backup':
# Inputs elements:
self.streampipe.add(self.videosrc_backup)
def link_pipeline_elements(self):
"""Link all elements with static pads."""
print(INFO, gettime(), 'Pipeline creation state: linking elements... ', end='')
+ cond = self.feed != 'test'
+
# Audio feed:
self.audiosrc.link(self.audiolevel)
self.audiolevel.link(self.queuea_1)
- self.queuea_1.link(self.vorbisenc)
- self.connect_tee(self.tee_rawaudio,
- self.vorbisenc,
- self.queuea_2,
- self.queuea_5,)
- self.queuea_2.link(self.oggmux)
- self.connect_tee(self.tee_streamaudio,
- self.oggmux,
- self.queuea_3,
- self.queuea_4,)
- self.queuea_3.link(self.disksink_audio)
- self.queuea_4.link(self.icecastsink_audio)
- self.queuea_5.link(self.webmmux)
+ if cond:
+ self.queuea_1.link(self.vorbisenc)
+ self.connect_tee(self.tee_rawaudio,
+ self.vorbisenc,
+ self.queuea_2,
+ self.queuea_5,)
+ self.queuea_2.link(self.oggmux)
+ self.connect_tee(self.tee_streamaudio,
+ self.oggmux,
+ self.queuea_3,
+ self.queuea_4,)
+ self.queuea_3.link(self.disksink_audio)
+ self.queuea_4.link(self.icecastsink_audio)
+ self.queuea_5.link(self.webmmux)
+ else:
+ self.queuea_1.link(self.audiosink)
+
# Video feed:
- self.queuev_2.link(self.mkvmux)
- self.mkvmux.link(self.queuev_4)
- self.queuev_4.link(self.disksink_rawvideo)
+ if cond:
+ self.queuev_2.link(self.mkvmux)
+ self.mkvmux.link(self.queuev_4)
+ self.queuev_4.link(self.disksink_rawvideo)
+ else:
+ self.queuev_1.link(self.rtpjpegdepay)
+ self.rtpjpegdepay.link(self.jpegdec)
+ self.jpegdec.link(self.queuev_3)
self.queuev_3.link(self.screensink)
+
# Stream (audio+video) feed:
- self.vp8enc.link(self.queuev_5)
- self.queuev_5.link(self.webmmux)
- self.connect_tee(self.tee_streamfull,
- self.webmmux,
- self.queuem_1,
- self.queuem_2,)
- self.queuem_1.link(self.disksink_stream)
- self.queuem_2.link(self.icecastsink_stream)
- if self.feed == 'main':
- # linking here RTSP feed
- self.queuev_1.link(self.rtpjpegdepay)
- self.connect_tee(self.tee_rawvideo,
- self.rtpjpegdepay,
- self.queuev_2,
- self.jpegdec,)
- self.connect_tee(self.tee_videodecoded,
- self.jpegdec,
- self.queuev_3,
- self.scaling,)
- # Stream (video) feed:
- self.scaling.link(self.capsfilter)
- self.capsfilter.link(self.vp8enc)
-
- elif self.feed == 'backup':
- # linking here backup feed (WEBCAM)
- self.videosrc_backup.link(self.capsfilter_backup)
- self.connect_tee(self.tee_rawvideo,
- self.capsfilter_backup,
- self.queuev_2,
- self.queuev_3,
- output_element_3=self.vp8enc)
+ if cond:
+ self.vp8enc.link(self.queuev_5)
+ self.queuev_5.link(self.webmmux)
+ self.connect_tee(self.tee_streamfull,
+ self.webmmux,
+ self.queuem_1,
+ self.queuem_2,)
+ self.queuem_1.link(self.disksink_stream)
+ self.queuem_2.link(self.icecastsink_stream)
+ if self.feed == 'main':
+ # linking here RTSP feed
+ self.queuev_1.link(self.rtpjpegdepay)
+ self.connect_tee(self.tee_rawvideo,
+ self.rtpjpegdepay,
+ self.queuev_2,
+ self.jpegdec,)
+ self.connect_tee(self.tee_videodecoded,
+ self.jpegdec,
+ self.queuev_3,
+ self.scaling,)
+ # Stream (video) feed:
+ self.scaling.link(self.capsfilter)
+ self.capsfilter.link(self.vp8enc)
+ elif self.feed == 'backup':
+ # linking here backup feed (WEBCAM)
+ self.videosrc_backup.link(self.capsfilter_backup)
+ self.connect_tee(self.tee_rawvideo,
+ self.capsfilter_backup,
+ self.queuev_2,
+ self.queuev_3,
+ output_element_3=self.vp8enc)
## self.capsfilter_backup.link(self.queuev_3)
- # Stream (video) feed:
- print('BACKUP OK...', end='')
+ print('BACKUP OK...', end='')
+ if not cond:
+ print('TEST OK...', end='')
print('linked')
def create_gstreamer_pipeline(self):
# Setting-up:
self.add_elements_to_pipeline()
self.link_pipeline_elements()
- if self.feed == 'main':
+ if self.feed == 'main' or self.feed == 'test':
self.create_pipeline_callbacks()
global bus
return self.streampipe
def on_message(self, bus, message):
- #
-## print("[MESSAGE]", message.get_structure().get_name()) # [DEBUG]
- #
t = message.type
if t == Gst.MessageType.EOS:
self.streampipe.set_state(Gst.State.NULL)
elif t == Gst.MessageType.ERROR:
err, debug = message.parse_error()
print (ERROR, '%s' % err, debug)
-# self.streampipe.set_state(Gst.State.NULL)
def stream_play(self):
self.streampipe.set_state(Gst.State.PLAYING)