diff options
Diffstat (limited to 'prepare-videochat.sh')
-rwxr-xr-x | prepare-videochat.sh | 110 |
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!" |