From a41749602f8bde580979ffd325e373adfc7a475e Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Wed, 18 Jan 2023 16:02:57 +0100 Subject: [PATCH] Update openvidu-recording image --- .../{ubuntu-22-04.Dockerfile => Dockerfile} | 7 +- .../docker/openvidu-recording/create_image.sh | 11 +- .../docker/openvidu-recording/entrypoint.sh | 8 +- .../openvidu-recording/scripts/composed.sh | 100 +++++------------- .../scripts/composed_quick_start.sh | 99 +++++------------ .../docker/openvidu-recording/scripts/rtmp.sh | 47 ++++++++ .../ubuntu-16-04.Dockerfile | 40 ------- .../ubuntu-20-04.Dockerfile | 43 -------- .../utils/headless-chrome.sh | 52 +++++++++ .../openvidu-recording/utils/xvfb-run-safe | 17 ++- 10 files changed, 175 insertions(+), 249 deletions(-) rename openvidu-server/docker/openvidu-recording/{ubuntu-22-04.Dockerfile => Dockerfile} (89%) create mode 100644 openvidu-server/docker/openvidu-recording/scripts/rtmp.sh delete mode 100644 openvidu-server/docker/openvidu-recording/ubuntu-16-04.Dockerfile delete mode 100644 openvidu-server/docker/openvidu-recording/ubuntu-20-04.Dockerfile create mode 100644 openvidu-server/docker/openvidu-recording/utils/headless-chrome.sh diff --git a/openvidu-server/docker/openvidu-recording/ubuntu-22-04.Dockerfile b/openvidu-server/docker/openvidu-recording/Dockerfile similarity index 89% rename from openvidu-server/docker/openvidu-recording/ubuntu-22-04.Dockerfile rename to openvidu-server/docker/openvidu-recording/Dockerfile index bb101612..10a04940 100644 --- a/openvidu-server/docker/openvidu-recording/ubuntu-22-04.Dockerfile +++ b/openvidu-server/docker/openvidu-recording/Dockerfile @@ -31,11 +31,12 @@ RUN adduser root pulse-access # Clean RUN apt clean && apt autoclean && apt autoremove -COPY entrypoint.sh scripts/composed.sh scripts/composed_quick_start.sh ./ -COPY utils/xvfb-run-safe /usr/local/bin +COPY entrypoint.sh scripts/composed.sh scripts/composed_quick_start.sh scripts/rtmp.sh ./ +COPY utils/xvfb-run-safe /usr/local/bin +COPY utils/headless-chrome.sh ./ # Prepare scripts and folders -RUN chmod +x /entrypoint.sh /composed.sh /composed_quick_start.sh \ +RUN chmod +x /entrypoint.sh /composed.sh /composed_quick_start.sh /rtmp.sh /headless-chrome.sh \ && chmod +x /usr/local/bin/xvfb-run-safe \ && mkdir /recordings \ && chmod 777 /recordings diff --git a/openvidu-server/docker/openvidu-recording/create_image.sh b/openvidu-server/docker/openvidu-recording/create_image.sh index c627cc61..bfea44fe 100755 --- a/openvidu-server/docker/openvidu-recording/create_image.sh +++ b/openvidu-server/docker/openvidu-recording/create_image.sh @@ -1,9 +1,8 @@ #!/bin/bash -x -# eg: $ ./create_image.sh ubuntu-20-04 86.0.4240.193-1 2.16.0 -OPENVIDU_RECORDING_UBUNTU_VERSION=$1 -OPENVIDU_RECORDING_CHROME_VERSION=$2 # https://www.ubuntuupdates.org/package_logs?noppa=&page=1&type=ppas&vals=8# -OPENVIDU_RECORDING_DOCKER_TAG=$3 -docker build --rm --pull --no-cache --build-arg CHROME_VERSION="$OPENVIDU_RECORDING_CHROME_VERSION" \ - -f $OPENVIDU_RECORDING_UBUNTU_VERSION.Dockerfile \ +# eg: $ ./create_image.sh 109.0.5414.74-1 2.25.0 +OPENVIDU_RECORDING_CHROME_VERSION=$1 # https://www.ubuntuupdates.org/package_logs?noppa=&page=1&type=ppas&vals=8# +OPENVIDU_RECORDING_DOCKER_TAG=$2 +docker build --rm --pull --no-cache \ + --build-arg CHROME_VERSION="$OPENVIDU_RECORDING_CHROME_VERSION" \ -t openvidu/openvidu-recording:$OPENVIDU_RECORDING_DOCKER_TAG . \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-recording/entrypoint.sh b/openvidu-server/docker/openvidu-recording/entrypoint.sh index 82058479..07453464 100755 --- a/openvidu-server/docker/openvidu-recording/entrypoint.sh +++ b/openvidu-server/docker/openvidu-recording/entrypoint.sh @@ -8,12 +8,14 @@ if [ "$HEADLESS_CHROME_ONLY" == true ]; then else ### Use container as OpenVidu recording module ### - RECORDING_TYPE=${RECORDING_TYPE:-COMPOSED} + CONTAINER_WORKING_MODE=${CONTAINER_WORKING_MODE:-COMPOSED} - if [[ "${RECORDING_TYPE}" == "COMPOSED" ]]; then + if [[ "${CONTAINER_WORKING_MODE}" == "COMPOSED" ]]; then ./composed.sh - elif [[ "${RECORDING_TYPE}" == "COMPOSED_QUICK_START" ]]; then + elif [[ "${CONTAINER_WORKING_MODE}" == "COMPOSED_QUICK_START" ]]; then ./composed_quick_start.sh + elif [[ "${CONTAINER_WORKING_MODE}" == "RTMP" ]]; then + ./rtmp.sh fi fi \ No newline at end of file diff --git a/openvidu-server/docker/openvidu-recording/scripts/composed.sh b/openvidu-server/docker/openvidu-recording/scripts/composed.sh index 6b4f6c32..5f0627cc 100644 --- a/openvidu-server/docker/openvidu-recording/scripts/composed.sh +++ b/openvidu-server/docker/openvidu-recording/scripts/composed.sh @@ -3,7 +3,7 @@ # DEBUG MODE DEBUG_MODE=${DEBUG_MODE:-false} if [[ ${DEBUG_MODE} == true ]]; then - DEBUG_CHROME_FLAGS="--enable-logging --v=1" + DEBUG_CHROME_FLAGS="--enable-logging --v=1" fi { @@ -13,8 +13,8 @@ fi ONLY_VIDEO=${ONLY_VIDEO:-false} RESOLUTION=${RESOLUTION:-1280x720} FRAMERATE=${FRAMERATE:-25} - WIDTH="$(cut -d'x' -f1 <<< $RESOLUTION)" - HEIGHT="$(cut -d'x' -f2 <<< $RESOLUTION)" + WIDTH="$(cut -d'x' -f1 <<<$RESOLUTION)" + HEIGHT="$(cut -d'x' -f2 <<<$RESOLUTION)" VIDEO_ID=${VIDEO_ID:-video} VIDEO_NAME=${VIDEO_NAME:-video} VIDEO_FORMAT=${VIDEO_FORMAT:-mp4} @@ -30,80 +30,37 @@ fi export VIDEO_NAME export VIDEO_FORMAT export RECORDING_JSON - - echo "==== Loaded Environment Variables =======================" + + echo + echo "============= Loaded Environment Variables =============" env - echo "=========================================================" + echo "========================================================" + echo ### Store Recording json data ### - mkdir /recordings/$VIDEO_ID + mkdir -p /recordings/$VIDEO_ID chmod 777 /recordings/$VIDEO_ID - echo $RECORDING_JSON > /recordings/$VIDEO_ID/.recording.$VIDEO_ID + echo $RECORDING_JSON >/recordings/$VIDEO_ID/.recording.$VIDEO_ID - # Cleanup to be "stateless" on startup, otherwise pulseaudio daemon can't start - rm -rf /var/run/pulse /var/lib/pulse /root/.config/pulse - # Run pulseaudio - pulseaudio -D --system --disallow-exit --disallow-module-loading + ### Run headless Chrome ### - ### Start Chrome in headless mode with xvfb, using the display num previously obtained ### + source /headless-chrome.sh - touch xvfb.log - chmod 777 xvfb.log - - xvfb-run-safe --server-args="-ac -screen 0 ${RESOLUTION}x24 -noreset" google-chrome \ - --kiosk \ - --start-maximized \ - --test-type \ - --no-sandbox \ - --disable-infobars \ - --disable-gpu \ - --disable-popup-blocking \ - --window-size=$WIDTH,$HEIGHT \ - --window-position=0,0 \ - --no-first-run \ - --disable-features=Translate \ - --ignore-certificate-errors \ - --disable-dev-shm-usage \ - --autoplay-policy=no-user-gesture-required \ - --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT' \ - --disable-sync \ - --no-default-browser-check \ - --disable-component-update \ - --disable-background-networking \ - --disable-default-apps \ - $DEBUG_CHROME_FLAGS $URL &> xvfb.log & - - touch stop chmod 777 /recordings - until pids=$(pidof Xvfb) - do - sleep 0.1 - done - - ### Calculate the display num in use parsing args of command "Xvfb" - - XVFB_ARGS=$(ps -eo args | grep [X]vfb) - DISPLAY_NUM=$(echo $XVFB_ARGS | sed 's/Xvfb :\([0-9]\+\).*/\1/') - echo "Display in use -> :$DISPLAY_NUM" - echo "----------------------------------------" - - sleep 2 - ### Start recording with ffmpeg ### - if [[ "$ONLY_VIDEO" == true ]] - then - # Do not record audio - <./stop ffmpeg -y -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" - else - # Record audio ("-f alsa -i pulse [...] -c:a aac") - <./stop ffmpeg -y -f alsa -i pulse -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:a aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" + if [[ "$ONLY_VIDEO" == true ]]; then + # Do not record audio + ffmpeg <./stop -y -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" + else + # Record audio ("-f alsa -i pulse [...] -c:a aac") + ffmpeg <./stop -y -f alsa -i pulse -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:a aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" fi ### Generate video report file ### - ffprobe -v quiet -print_format json -show_format -show_streams /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT > /recordings/$VIDEO_ID/$VIDEO_ID.info + ffprobe -v quiet -print_format json -show_format -show_streams /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT >/recordings/$VIDEO_ID/$VIDEO_ID.info ### Update Recording json data ### @@ -116,19 +73,18 @@ fi SIZE=$(echo $INFO | jq '.format.size | tonumber') DURATION=$(echo $INFO | jq '.format.duration | tonumber') - if [[ "$HAS_AUDIO" == false && "$HAS_VIDEO" == false ]] - then - STATUS="failed" - else - STATUS="stopped" + if [[ "$HAS_AUDIO" == false && "$HAS_VIDEO" == false ]]; then + STATUS="failed" + else + STATUS="stopped" fi - jq -c -r ".hasAudio=$HAS_AUDIO | .hasVideo=$HAS_VIDEO | .duration=$DURATION | .size=$SIZE | .status=\"$STATUS\"" "/recordings/$VIDEO_ID/.recording.$VIDEO_ID" > $TMP && mv $TMP /recordings/$VIDEO_ID/.recording.$VIDEO_ID + jq -c -r ".hasAudio=$HAS_AUDIO | .hasVideo=$HAS_VIDEO | .duration=$DURATION | .size=$SIZE | .status=\"$STATUS\"" "/recordings/$VIDEO_ID/.recording.$VIDEO_ID" >$TMP && mv $TMP /recordings/$VIDEO_ID/.recording.$VIDEO_ID ### Generate video thumbnail ### MIDDLE_TIME=$(ffmpeg -i /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}') - THUMBNAIL_HEIGHT=$((480*$HEIGHT/$WIDTH)) + THUMBNAIL_HEIGHT=$((480 * $HEIGHT / $WIDTH)) ffmpeg -ss $MIDDLE_TIME -i /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT -vframes 1 -s 480x$THUMBNAIL_HEIGHT /recordings/$VIDEO_ID/$VIDEO_ID.jpg ### Change permissions to all generated files ### @@ -138,9 +94,9 @@ fi } 2>&1 | tee -a /tmp/container.log if [[ ${DEBUG_MODE} == "true" ]]; then - [[ -f /tmp/container.log ]] && cp /tmp/container.log /recordings/$VIDEO_ID/$VIDEO_ID-container.log || echo "/tmp/container.log not found" - [[ -f ~/.config/google-chrome/chrome_debug.log ]] && cp ~/.config/google-chrome/chrome_debug.log /recordings/$VIDEO_ID/chrome_debug.log || echo "~/.config/google-chrome/chrome_debug.log" + [[ -f /tmp/container.log ]] && cp /tmp/container.log /recordings/$VIDEO_ID/$VIDEO_ID-container.log || echo "/tmp/container.log not found" + [[ -f ~/.config/google-chrome/chrome_debug.log ]] && cp ~/.config/google-chrome/chrome_debug.log /recordings/$VIDEO_ID/chrome_debug.log || echo "~/.config/google-chrome/chrome_debug.log" fi ### Change permissions to all generated files ### -sudo chmod -R 777 /recordings/$VIDEO_ID \ No newline at end of file +sudo chmod -R 777 /recordings/$VIDEO_ID diff --git a/openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh b/openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh index d3ec5b34..b6c1f90c 100644 --- a/openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh +++ b/openvidu-server/docker/openvidu-recording/scripts/composed_quick_start.sh @@ -10,7 +10,7 @@ fi # Possible values are: # - Without parameters: Just execute all necessary configuration for xfvb and start chrome, waiting forever with a session openned # - --start-recording: Executes ffmpeg to record a session but don't stop chrome -# - --process-recording: Process ffmpeg video and generates a metadata +# - --stop-recording: Process ffmpeg video and generates metadata export COMPOSED_QUICK_START_ACTION=$1 if [[ -z "${COMPOSED_QUICK_START_ACTION}" ]]; then @@ -20,58 +20,16 @@ if [[ -z "${COMPOSED_QUICK_START_ACTION}" ]]; then export RESOLUTION=${RESOLUTION:-1280x720} export URL=${URL:-https://www.youtube.com/watch?v=JMuzlEQz3uo} export VIDEO_ID=${VIDEO_ID:-video} - export WIDTH="$(cut -d'x' -f1 <<< $RESOLUTION)" - export HEIGHT="$(cut -d'x' -f2 <<< $RESOLUTION)" + export WIDTH="$(cut -d'x' -f1 <<<$RESOLUTION)" + export HEIGHT="$(cut -d'x' -f2 <<<$RESOLUTION)" export RECORDING_MODE=${RECORDING_MODE} - # Cleanup to be "stateless" on startup, otherwise pulseaudio daemon can't start - rm -rf /var/run/pulse /var/lib/pulse /root/.config/pulse - # Run pulseaudio - pulseaudio -D --system --disallow-exit --disallow-module-loading + ### Run headless Chrome ### - ### Start Chrome in headless mode with xvfb, using the display num previously obtained ### + source /headless-chrome.sh - touch xvfb.log - chmod 777 xvfb.log - - xvfb-run-safe --server-args="-ac -screen 0 ${RESOLUTION}x24 -noreset" google-chrome \ - --kiosk \ - --start-maximized \ - --test-type \ - --no-sandbox \ - --disable-infobars \ - --disable-gpu \ - --disable-popup-blocking \ - --window-size=$WIDTH,$HEIGHT \ - --window-position=0,0 \ - --no-first-run \ - --disable-features=Translate \ - --ignore-certificate-errors \ - --disable-dev-shm-usage \ - --autoplay-policy=no-user-gesture-required \ - --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT' \ - --disable-sync \ - --no-default-browser-check \ - --disable-component-update \ - --disable-background-networking \ - --disable-default-apps \ - $DEBUG_CHROME_FLAGS $URL &> xvfb.log & - - chmod 777 /recordings - - until pids=$(pidof Xvfb) - do - sleep 0.1 - done - - ### Calculate the display num in use parsing args of command "Xvfb" - - XVFB_ARGS=$(ps -eo args | grep [X]vfb) - DISPLAY_NUM=$(echo $XVFB_ARGS | sed 's/Xvfb :\([0-9]\+\).*/\1/') - echo "Display in use -> :$DISPLAY_NUM" - echo "----------------------------------------" # Save Global Environment variables - echo "export DISPLAY_NUM=$DISPLAY_NUM" > /tmp/display_num + echo "export DISPLAY_NUM=${DISPLAY_NUM}" >/tmp/display_num } 2>&1 | tee -a /tmp/container-start.log @@ -89,8 +47,8 @@ elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--start-recording" ]]; then # Variables export RESOLUTION=${RESOLUTION:-1280x720} - export WIDTH="$(cut -d'x' -f1 <<< $RESOLUTION)" - export HEIGHT="$(cut -d'x' -f2 <<< $RESOLUTION)" + export WIDTH="$(cut -d'x' -f1 <<<$RESOLUTION)" + export HEIGHT="$(cut -d'x' -f2 <<<$RESOLUTION)" export ONLY_VIDEO=${ONLY_VIDEO:-false} export FRAMERATE=${FRAMERATE:-25} export VIDEO_ID=${VIDEO_ID:-video} @@ -98,32 +56,33 @@ elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--start-recording" ]]; then export VIDEO_FORMAT=${VIDEO_FORMAT:-mp4} export RECORDING_JSON="${RECORDING_JSON}" - echo "==== Loaded Environment Variables - Start Recording =====" + echo + echo "==== Loaded Environment Variables - Start Recording ====" env - echo "=========================================================" + echo "========================================================" + echo ### Store Recording json data ### - mkdir /recordings/$VIDEO_ID - echo $RECORDING_JSON > /recordings/$VIDEO_ID/.recording.$VIDEO_ID + mkdir -p /recordings/$VIDEO_ID + echo $RECORDING_JSON >/recordings/$VIDEO_ID/.recording.$VIDEO_ID chmod 777 -R /recordings/$VIDEO_ID # Save Global Environment variables - env > /tmp/global_environment_vars + env >/tmp/global_environment_vars ### Start recording with ffmpeg ### - if [[ "$ONLY_VIDEO" == true ]] - then + if [[ "$ONLY_VIDEO" == true ]]; then # Do not record audio - <./stop ffmpeg -y -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" + ffmpeg <./stop -y -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" else # Record audio ("-f alsa -i pulse [...] -c:a aac") - <./stop ffmpeg -y -f alsa -i pulse -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:a aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" + ffmpeg <./stop -y -f alsa -i pulse -f x11grab -draw_mouse 0 -framerate $FRAMERATE -video_size $RESOLUTION -i :$DISPLAY_NUM -c:a aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p -filter:v fps=$FRAMERATE "/recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" fi # Warn the stop thread about ffmpeg process being completed - echo "ffmpeg-completed" > /tmp/$VIDEO_ID-completed.txt + echo "ffmpeg-completed" >/tmp/$VIDEO_ID-completed.txt } 2>&1 | tee -a /tmp/container-start-recording.log @@ -140,18 +99,17 @@ elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--stop-recording" ]]; then # Stop ffmpeg process FFMPEG_PID=$(pgrep ffmpeg) - echo 'q' > stop && tail --pid=$FFMPEG_PID -f /dev/null + echo 'q' >stop && tail --pid=$FFMPEG_PID -f /dev/null ## Wait for the ffmpeg process to be finished - until [ -f /tmp/$VIDEO_ID-completed.txt ] - do + until [ -f /tmp/$VIDEO_ID-completed.txt ]; do # Check 20 times per second sleep 0.05 done rm -f /tmp/$VIDEO_ID-completed.txt ### Generate video report file ### - ffprobe -v quiet -print_format json -show_format -show_streams /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT > /recordings/$VIDEO_ID/$VIDEO_ID.info + ffprobe -v quiet -print_format json -show_format -show_streams /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT >/recordings/$VIDEO_ID/$VIDEO_ID.info ### Change permissions to all generated files ### sudo chmod -R 777 /recordings/$VIDEO_ID @@ -166,14 +124,13 @@ elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--stop-recording" ]]; then SIZE=$(echo $INFO | jq '.format.size | tonumber') DURATION=$(echo $INFO | jq '.format.duration | tonumber') - if [[ "$HAS_AUDIO" == false && "$HAS_VIDEO" == false ]] - then + if [[ "$HAS_AUDIO" == false && "$HAS_VIDEO" == false ]]; then STATUS="failed" else STATUS="stopped" fi - jq -c -r ".hasAudio=$HAS_AUDIO | .hasVideo=$HAS_VIDEO | .duration=$DURATION | .size=$SIZE | .status=\"$STATUS\"" "/recordings/$VIDEO_ID/.recording.$VIDEO_ID" > $TMP && mv $TMP /recordings/$VIDEO_ID/.recording.$VIDEO_ID + jq -c -r ".hasAudio=$HAS_AUDIO | .hasVideo=$HAS_VIDEO | .duration=$DURATION | .size=$SIZE | .status=\"$STATUS\"" "/recordings/$VIDEO_ID/.recording.$VIDEO_ID" >$TMP && mv $TMP /recordings/$VIDEO_ID/.recording.$VIDEO_ID rm -f $TMP ### Change permissions to metadata file ### @@ -182,8 +139,8 @@ elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--stop-recording" ]]; then ### Generate video thumbnail ### MIDDLE_TIME=$(ffmpeg -i /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}') - THUMBNAIL_HEIGHT=$((480*$HEIGHT/$WIDTH)) - ffmpeg -ss $MIDDLE_TIME -i /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT -vframes 1 -s 480x$THUMBNAIL_HEIGHT /recordings/$VIDEO_ID/$VIDEO_ID.jpg &> /tmp/ffmpeg-thumbnail.log + THUMBNAIL_HEIGHT=$((480 * $HEIGHT / $WIDTH)) + ffmpeg -ss $MIDDLE_TIME -i /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT -vframes 1 -s 480x$THUMBNAIL_HEIGHT /recordings/$VIDEO_ID/$VIDEO_ID.jpg &>/tmp/ffmpeg-thumbnail.log echo "Recording finished /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT" @@ -200,7 +157,3 @@ fi ### Change permissions to all generated files ### sudo chmod -R 777 /recordings/$VIDEO_ID - - - - diff --git a/openvidu-server/docker/openvidu-recording/scripts/rtmp.sh b/openvidu-server/docker/openvidu-recording/scripts/rtmp.sh new file mode 100644 index 00000000..1bf7a1df --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/scripts/rtmp.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# DEBUG MODE +DEBUG_MODE=${DEBUG_MODE:-false} +if [[ ${DEBUG_MODE} == true ]]; then + DEBUG_CHROME_FLAGS="--enable-logging --v=1" +fi + +{ + + ### Variables ### + + RTMP_URL=${RTMP_URL} + URL=${URL:-https://www.youtube.com/watch?v=JMuzlEQz3uo} + RESOLUTION=${RESOLUTION:-1920x1080} + FRAMERATE=${FRAMERATE:-25} + WIDTH="$(cut -d'x' -f1 <<<$RESOLUTION)" + HEIGHT="$(cut -d'x' -f2 <<<$RESOLUTION)" + + export RTMP_URL + export URL + export RESOLUTION + export FRAMERATE + export WIDTH + export HEIGHT + + echo + echo "============= Loaded Environment Variables =============" + env + echo "========================================================" + echo + + ### Run headless Chrome ### + + source /headless-chrome.sh + + ### Run RTMP command ### + + eval "$RTMP_COMMAND" + +} 2>&1 | tee -a /tmp/container.log + +if [[ ${DEBUG_MODE} == "true" ]]; then + mkdir -p /logs + [[ -f /tmp/container.log ]] && cp /tmp/container.log /logs/$(date +%s) || echo "/tmp/container.log not found" + sudo chmod -R 777 /logs/$(date +%s) +fi diff --git a/openvidu-server/docker/openvidu-recording/ubuntu-16-04.Dockerfile b/openvidu-server/docker/openvidu-recording/ubuntu-16-04.Dockerfile deleted file mode 100644 index 5a108ffb..00000000 --- a/openvidu-server/docker/openvidu-recording/ubuntu-16-04.Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM ubuntu:16.04 -MAINTAINER info@openvidu.io - -ARG CHROME_VERSION - -# Install Chrome -RUN apt-get update && apt-get -y upgrade && apt-get install -y wget sudo \ - # Language Fonts - ttf-ancient-fonts fonts-beng fonts-wqy-zenhei fonts-indic - -RUN wget http://dl.google.com/linux/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && apt install -y ./google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && rm google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && google-chrome --version - -# Install media packages -RUN apt-get install -y software-properties-common -RUN add-apt-repository ppa:jonathonf/ffmpeg-4 -RUN apt-get update -RUN apt-get install -y ffmpeg pulseaudio xvfb - -# Install jq for managing JSON -RUN apt-get install -y jq - -# Add root user to pulseaudio group -RUN adduser root pulse-access - -# Clean -RUN apt-get autoclean - -COPY entrypoint.sh scripts/composed.sh scripts/composed_quick_start.sh ./ -COPY utils/xvfb-run-safe /usr/local/bin - -# Prepare scripts and folders -RUN chmod +x /entrypoint.sh /composed.sh /composed_quick_start.sh \ - && chmod +x /usr/local/bin/xvfb-run-safe \ - && mkdir /recordings \ - && chmod 777 /recordings - -ENTRYPOINT /entrypoint.sh diff --git a/openvidu-server/docker/openvidu-recording/ubuntu-20-04.Dockerfile b/openvidu-server/docker/openvidu-recording/ubuntu-20-04.Dockerfile deleted file mode 100644 index ee38eb0b..00000000 --- a/openvidu-server/docker/openvidu-recording/ubuntu-20-04.Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -FROM ubuntu:20.04 -MAINTAINER info@openvidu.io - -ARG CHROME_VERSION - -# Install packages -RUN apt-get update && apt-get -y upgrade && apt-get install -y \ - wget \ - sudo \ - gnupg2 \ - apt-utils \ - software-properties-common \ - ffmpeg \ - pulseaudio \ - xvfb \ - jq \ - # Language Fonts - ttf-ancient-fonts fonts-beng fonts-wqy-zenhei fonts-indic \ - && rm -rf /var/lib/apt/lists/* - -# Install chrome -RUN apt-get update && apt-get -y upgrade && apt-get install -y wget sudo -RUN wget http://dl.google.com/linux/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && apt install -y ./google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && rm google-chrome-stable_${CHROME_VERSION}_amd64.deb \ - && google-chrome --version - -# Add root user to pulseaudio group -RUN adduser root pulse-access - -# Clean -RUN apt-get clean && apt-get autoclean && apt-get autoremove - -COPY entrypoint.sh scripts/composed.sh scripts/composed_quick_start.sh ./ -COPY utils/xvfb-run-safe /usr/local/bin - -# Prepare scripts and folders -RUN chmod +x /entrypoint.sh /composed.sh /composed_quick_start.sh \ - && chmod +x /usr/local/bin/xvfb-run-safe \ - && mkdir /recordings \ - && chmod 777 /recordings - -ENTRYPOINT /entrypoint.sh diff --git a/openvidu-server/docker/openvidu-recording/utils/headless-chrome.sh b/openvidu-server/docker/openvidu-recording/utils/headless-chrome.sh new file mode 100644 index 00000000..08852520 --- /dev/null +++ b/openvidu-server/docker/openvidu-recording/utils/headless-chrome.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +echo +echo "================ Running headless Chrome ===============" + +# Cleanup to be "stateless" on startup, otherwise pulseaudio daemon can't start +rm -rf /var/run/pulse /var/lib/pulse /root/.config/pulse +# Run pulseaudio +pulseaudio -D --system --disallow-exit --disallow-module-loading + +### Start Chrome in headless mode with xvfb, using the display num previously obtained ### + +touch xvfb.log +chmod 777 xvfb.log + +xvfb-run-safe --server-args="-ac -screen 0 ${RESOLUTION}x24 -noreset" google-chrome \ + --kiosk \ + --start-maximized \ + --test-type \ + --no-sandbox \ + --disable-infobars \ + --disable-gpu \ + --disable-popup-blocking \ + --window-size=$WIDTH,$HEIGHT \ + --window-position=0,0 \ + --no-first-run \ + --disable-features=Translate \ + --ignore-certificate-errors \ + --disable-dev-shm-usage \ + --autoplay-policy=no-user-gesture-required \ + --simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT' \ + --disable-sync \ + --no-default-browser-check \ + --disable-component-update \ + --disable-background-networking \ + --disable-default-apps \ + $DEBUG_CHROME_FLAGS $URL &>xvfb.log & + +until pids=$(pidof Xvfb); do + sleep 0.1 + echo "Waiting for Xvfb to start..." +done + +touch stop + +### Calculate the display num in use parsing args of command "Xvfb" + +export XVFB_ARGS=$(ps -eo args | grep [X]vfb) +export DISPLAY_NUM=$(echo $XVFB_ARGS | sed 's/Xvfb :\([0-9]\+\).*/\1/') +echo "Display in use -> :$DISPLAY_NUM" +echo "========================================================" +echo diff --git a/openvidu-server/docker/openvidu-recording/utils/xvfb-run-safe b/openvidu-server/docker/openvidu-recording/utils/xvfb-run-safe index 1924b921..6c28f316 100644 --- a/openvidu-server/docker/openvidu-recording/utils/xvfb-run-safe +++ b/openvidu-server/docker/openvidu-recording/utils/xvfb-run-safe @@ -2,21 +2,20 @@ # allow settings to be updated via environment : "${xvfb_lockdir:=/recordings/.xvfb-locks}" # Lock folder necessary to block displays -: "${xvfb_display_min:=99}" # Min display -: "${xvfb_display_max:=599}" # Max display - - +: "${xvfb_display_min:=99}" # Min display +: "${xvfb_display_max:=599}" # Max display mkdir -p -- "$xvfb_lockdir" || exit -i=$xvfb_display_min # minimum display number -while (( i < xvfb_display_max )); do +i=$xvfb_display_min # minimum display number +while ((i < xvfb_display_max)); do if [ -f "/tmp/.X$i-lock" ]; then - (( ++i )); continue + ((++i)) + continue fi exec 5>"$xvfb_lockdir/$i" || continue if flock -x -n 5; then exec xvfb-run --server-num="$i" "$@" || exit fi - (( i++ )) -done \ No newline at end of file + ((i++)) +done