summaryrefslogtreecommitdiff
path: root/prepare-videochat.sh
diff options
context:
space:
mode:
authorC.J. Adams-Collier <cjac@colliertech.org>2016-01-12 08:43:11 -0800
committerC.J. Adams-Collier <cjac@colliertech.org>2016-01-12 08:43:11 -0800
commit190cc7606914e3b097b28702e3a5305199558436 (patch)
tree4c970383e0c2497df319c376dec3a3db3a9a0e17 /prepare-videochat.sh
parent8fecf681ea9c68ba1e4a97a90e85a0d850f3f9ae (diff)
some job control, prompting for user to end the stream, redirecting zenity noise to null
Diffstat (limited to 'prepare-videochat.sh')
-rwxr-xr-xprepare-videochat.sh110
1 files changed, 56 insertions, 54 deletions
diff --git a/prepare-videochat.sh b/prepare-videochat.sh
index 38a36d2..31b1d1e 100755
--- a/prepare-videochat.sh
+++ b/prepare-videochat.sh
@@ -118,28 +118,35 @@ WIFI_IP=192.168.2.140
# Port on which IP Webcam is listening
PORT=8080
+# Dimensions of video
+WIDTH=640
+HEIGHT=480
+
+# Frame rate of video
+GST_FPS=5
+
### FUNCTIONS
has_kernel_module() {
- sudo modprobe -q "$1"
+ sudo modprobe -q "$1" > /dev/null 2>&1
}
error() {
- zenity --error --text "$@"
+ zenity --error --text "$@" > /dev/null 2>&1
exit 1
}
warning() {
- zenity --warning --text "$@"
+ zenity --warning --text "$@" > /dev/null 2>&1
}
info() {
- zenity --info --text "$@"
+ zenity --info --text "$@" > /dev/null 2>&1
}
confirm() {
- zenity --question --text "$@"
+ zenity --question --text "$@" > /dev/null 2>&1
}
can_run() {
@@ -177,6 +184,15 @@ start_iw_server() {
sleep 2s
}
+modid_by_sinkname() {
+ pacmd list-sinks | grep -e 'name:' -e 'module:' | grep -A1 "name: <$1>" | grep module: | cut -f2 -d: | tr -d ' '
+}
+
+modid_by_sourcename() {
+ pacmd list-sources | grep -e 'name:' -e 'module:' | grep -A1 "name: <$1>" | grep module: | cut -f2 -d: | tr -d ' '
+}
+
+
if can_run lsb_release; then
DIST=`lsb_release -i | awk -F: '{print $2}'`
RELEASE=`lsb_release -r | awk -F: '{print $2}'`
@@ -288,54 +304,31 @@ while ! iw_server_is_started; do
info "The IP Webcam video feed is not reachable at $VIDEO_URL. Please open IP Webcam in your phone and start the server."
done
-SINK_NAME="ipwebcam"
-# Load null-sink if needed
-if !(pactl list sinks | grep -q $SINK_NAME); then
- pactl load-module module-null-sink sink_name="$SINK_NAME" sink_properties="device.description='IP\ Webcam'"
-fi
-SINK_ID=$(pactl list sinks | sed -n -e "/Owner Module:/h; /$SINK_NAME.monitor/{x; s/\s*Owner Module:\s*//g; p; q}")
-
-#DUPLEX_SINK_NAME="ipwebcam_mic"
-#if !(pactl list sinks | grep -q $DUPLEX_SINK_NAME); then
-# pactl load-module module-null-sink sink_name="$DUPLEX_SINK_NAME" sink_properties="device.description='IP\ Webcam\ and\ Mic\ MUX',filter.want=echo-cancel"
-#fi
-#DUPLEX_SINK_ID=$(pactl list sinks | sed -n -e "/Owner Module:/h; /$DUPLEX_SINK_NAME.monitor/{x; s/\s*Owner Module:\s*//g; p; q}")
-
-
-#if !(pactl list modules | grep -q "source=${SINK_NAME}.monitor sink=${DUPLEX_SINK_NAME}"); then
-# pactl load-module module-loopback source="${SINK_NAME}.monitor" sink="$DUPLEX_SINK_NAME"
-#fi
-#SINKMON_LOOP_ID=$(pactl list modules | sed -n -e "/Module #/h; /source=${SINK_NAME}.monitor sink=${DUPLEX_SINK_NAME}/{x; s/\s*Module #\s*//g; p; q}")
-
DEFAULT_SINK=$(pacmd dump | mawk '/set-default-sink/ {print $2}')
DEFAULT_SOURCE=$(pacmd dump | mawk '/set-default-source/ {print $2}')
-#if !(pactl list modules | grep -q "source=${DEFAULT_SINK} sink=${DUPLEX_SINK_NAME}"); then
-#if !(pactl list modules | grep -q "source=${DUPLEX_SINK_NAME}.monitor sink=${DEFAULT_SINK}"); then
-if !(pactl list modules | grep -q "source=${SINK_NAME}.monitor sink=${DEFAULT_SINK}"); then
-# pactl load-module module-loopback source=${DEFAULT_SINK} sink="$DUPLEX_SINK_NAME"
-# pactl load-module module-loopback source=${DUPLEX_SINK_NAME}.monitor sink="$DEFAULT_SINK"
- pactl load-module module-loopback source=${SINK_NAME}.monitor sink="$DEFAULT_SINK"
-fi
-#DEFAULT_LOOP_ID=$(pactl list modules | sed -n -e "/Module #/h; /source=${DEFAULT_SOURCE} sink=${DUPLEX_SINK_NAME}/{x; s/\s*Module #\s*//g; p; q}")
-#DEFAULT_LOOP_ID=$(pactl list modules | sed -n -e "/Module #/h; /source=${DUPLEX_SINK_NAME}.monitor sink=${DEFAULT_SINK}/{x; s/\s*Module #\s*//g; p; q}")
-DEFAULT_LOOP_ID=$(pactl list modules | sed -n -e "/Module #/h; /source=${SINK_NAME}.monitor sink=${DEFAULT_SINK}/{x; s/\s*Module #\s*//g; p; q}")
-
-pactl load-module module-echo-cancel \
- source_name="ipwebcam_efilter" source_master="${SINK_NAME}.monitor" source_properties="device.description='IP\ Webcam\ and\ Mic\ echo\ filter\ source'" \
- sink_name="default_efilter" sink_master="${DEFAULT_SINK}" sink_properties="device.description='IP\ Webcam\ and\ Mic\ echo\ filter\ sink'" \
- aec_method="webrtc" save_aec=1 use_volume_sharing=1
-
-# Install and open pavucontrol as needed
-if ! can_run pavucontrol; then
- info "You don't have pavucontrol. I'll try to install its Debian/Ubuntu package."
- sudo apt-get install -y pavucontrol
+SINK_NAME="ipwebcam"
+SINK_ID=$(modid_by_sinkname $SINK_NAME)
+ECANCEL_ID=$(modid_by_sinkname "${SINK_NAME}_echo_cancel")
+
+if [ -z $SINK_ID ] ; then
+ SINK_ID=$(pactl load-module module-null-sink \
+ rate=44100 \
+ format=s16le \
+ sink_name="$SINK_NAME" \
+ sink_properties="device.description='IP\ Webcam'")
fi
-if ! pgrep pavucontrol; then
- info "We will open now pavucontrol. You should leave it open to change the recording device of your video chat program to 'Monitor IP Webcam'. NOTE: make sure that in 'Output Devices' *all* devices are listed, and in the Playback tab the $GSTLAUNCH program sends its audio to the 'IP Webcam'."
- pavucontrol &
+
+if [ -z $ECANCEL_ID ] ; then
+ ECANCEL_ID=$(pactl load-module module-echo-cancel \
+ sink_name="${SINK_NAME}_echo_cancel" \
+ source_master="$SINK_NAME.monitor" \
+ sink_master="$DEFAULT_SINK" \
+ aec_method="webrtc" save_aec=1 use_volume_sharing=1)
fi
+pactl set-default-source $SINK_NAME.monitor
+
# Check for gst-launch
GSTLAUNCH=gst-launch-${GST_VER}
if [ $DIST = "Debian" ]; then
@@ -358,18 +351,14 @@ fi
# Start the GStreamer graph needed to grab the video and audio
set +e
-info "Using IP Webcam as webcam/microphone through v4l2loopback device $DEVICE. Microphone is directed to $SINK_NAME and multiplexed with ${DEFAULT_SOURCE}. You can now open your videochat app."
-WIDTH=640
-HEIGHT=480
-GST_FPS=5
DIMENSIONS="width=$WIDTH,height=$HEIGHT"
GST_0_10_CAPS="$GST_0_10_MIMETYPE,$GST_0_10_FORMAT,$DIMENSIONS"
CAPS="$GST_MIMETYPE,$GST_FORMAT,$DIMENSIONS,framerate=$GST_FPS/1" \
#sudo v4l2loopback-ctl set-caps $GST_0_10_CAPS $DEVICE
-"$GSTLAUNCH" -vt --gst-plugin-spew --gst-debug="$GST_DEBUG" \
+"$GSTLAUNCH" -e -vt --gst-plugin-spew --gst-debug="$GST_DEBUG" \
souphttpsrc location="$VIDEO_URL" do-timestamp=true is-live=true \
! multipartdemux \
! jpegdec \
@@ -385,8 +374,21 @@ CAPS="$GST_MIMETYPE,$GST_FORMAT,$DIMENSIONS,framerate=$GST_FPS/1" \
! volume volume=3 \
! rglimiter \
! pulsesink device="$SINK_NAME" sync=true \
- 2>&1 | tee feed.log
+ 2>&1 > feed.log &
-info "Disconnected from IP Webcam. Have a nice day!"
+GSTLAUNCH_PID=$!
+
+echo "PID of $GSTLAUNCH is $GSTLAUNCH_PID"
+
+info "IP Webcam video is streaming through v4l2loopback device $DEVICE.
+IP Webcam audio is streaming through pulseaudio sink '$SINK_NAME'.
+You can now open your videochat app."
+read -p "Press enter to end stream"
+
+kill $GSTLAUNCH_PID
+pactl set-default-source $DEFAULT_SOURCE
+pactl unload-module ${ECANCEL_ID}
pactl unload-module ${SINK_ID}
+
+info "Disconnected from IP Webcam. Have a nice day!"