Update openvidu-recording image

pull/786/head
pabloFuente 2023-01-18 16:02:57 +01:00
parent 2b2c2c8d01
commit a41749602f
10 changed files with 175 additions and 249 deletions

View File

@ -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 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

View File

@ -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 .

View File

@ -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

View File

@ -31,75 +31,32 @@ fi
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
# 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
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
### Generate video report file ###
@ -116,8 +73,7 @@ fi
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"

View File

@ -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
@ -24,54 +24,12 @@ if [[ -z "${COMPOSED_QUICK_START_ACTION}" ]]; then
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
@ -98,13 +56,15 @@ 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
mkdir -p /recordings/$VIDEO_ID
echo $RECORDING_JSON >/recordings/$VIDEO_ID/.recording.$VIDEO_ID
chmod 777 -R /recordings/$VIDEO_ID
@ -113,13 +73,12 @@ elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--start-recording" ]]; then
### 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
@ -143,8 +102,7 @@ elif [[ "${COMPOSED_QUICK_START_ACTION}" == "--stop-recording" ]]; then
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
@ -166,8 +124,7 @@ 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"
@ -200,7 +157,3 @@ fi
### Change permissions to all generated files ###
sudo chmod -R 777 /recordings/$VIDEO_ID

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -5,14 +5,13 @@
: "${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
if [ -f "/tmp/.X$i-lock" ]; then
(( ++i )); continue
((++i))
continue
fi
exec 5>"$xvfb_lockdir/$i" || continue
if flock -x -n 5; then