diff --git a/openvidu-server/docker/openvidu-recording/Dockerfile b/openvidu-server/docker/openvidu-recording/Dockerfile index e469c8b6..82545f26 100644 --- a/openvidu-server/docker/openvidu-recording/Dockerfile +++ b/openvidu-server/docker/openvidu-recording/Dockerfile @@ -2,7 +2,7 @@ FROM ubuntu:16.04 MAINTAINER openvidu@gmail.com # Install Chrome -RUN apt-get update && apt-get -y upgrade && apt-get install -y wget +RUN apt-get update && apt-get -y upgrade && apt-get install -y wget sudo RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list && \ apt-get update && apt-get install -y google-chrome-stable diff --git a/openvidu-server/docker/openvidu-recording/entrypoint.sh b/openvidu-server/docker/openvidu-recording/entrypoint.sh index b6010102..8ec19c17 100755 --- a/openvidu-server/docker/openvidu-recording/entrypoint.sh +++ b/openvidu-server/docker/openvidu-recording/entrypoint.sh @@ -1,13 +1,7 @@ #!/bin/bash - ### Variables ### -CURRENT_UID="$(id -u $USER)" -if [[ $CURRENT_UID != $USER_ID ]]; then - adduser --uid $USER_ID --disabled-password --gecos "" myuser -fi - URL=${URL:-https://www.youtube.com/watch?v=JMuzlEQz3uo} RESOLUTION=${RESOLUTION:-1920x1080} FRAMERATE=${FRAMERATE:-25} @@ -30,17 +24,9 @@ export RECORDING_JSON ### Store Recording json data ### -function1() { - mkdir /recordings/$VIDEO_ID - chmod 777 /recordings/$VIDEO_ID - echo $RECORDING_JSON > /recordings/$VIDEO_ID/.recording.$VIDEO_ID -} -export -f function1 -if [[ $CURRENT_UID != $USER_ID ]]; then - su myuser -c "bash -c function1" -else - function1 -fi +mkdir /recordings/$VIDEO_ID +chmod 777 /recordings/$VIDEO_ID +echo $RECORDING_JSON > /recordings/$VIDEO_ID/.recording.$VIDEO_ID ### Get a free display identificator ### @@ -65,99 +51,43 @@ export DISPLAY_NUM echo "First available display -> :$DISPLAY_NUM" echo "----------------------------------------" - -### Start pulseaudio ### - -function2() { - pulseaudio -D -} -export -f function2 -if [[ $CURRENT_UID != $USER_ID ]]; then - su myuser -c "bash -c function2" -else - function2 -fi - +pulseaudio -D ### Start Chrome in headless mode with xvfb, using the display num previously obtained ### touch xvfb.log chmod 777 xvfb.log - -function3() { - xvfb-run --server-num=${DISPLAY_NUM} --server-args="-ac -screen 0 ${RESOLUTION}x24 -noreset" google-chrome --start-maximized --no-sandbox --test-type --disable-infobars --window-size=$WIDTH,$HEIGHT --window-position=0,0 --no-first-run --ignore-certificate-errors --autoplay-policy=no-user-gesture-required --kiosk $URL &> xvfb.log & -} -export -f function3 -if [[ $CURRENT_UID != $USER_ID ]]; then - su myuser -c "bash -c function3" -else - function3 -fi - +xvfb-run --server-num=${DISPLAY_NUM} --server-args="-ac -screen 0 ${RESOLUTION}x24 -noreset" google-chrome --start-maximized --no-sandbox --test-type --disable-infobars --window-size=$WIDTH,$HEIGHT --window-position=0,0 --no-first-run --ignore-certificate-errors --autoplay-policy=no-user-gesture-required --kiosk $URL &> xvfb.log & touch stop chmod 777 /recordings - sleep 2 - ### Start recording with ffmpeg ### -function4() { - <./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" -} -export -f function4 -if [[ $CURRENT_UID != $USER_ID ]]; then - su myuser -c "bash -c function4" -else - function4 -fi - +<./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" ### Generate video report file ### - -function5() { - ffprobe -v quiet -print_format json -show_format -show_streams /recordings/$VIDEO_ID/$VIDEO_NAME.$VIDEO_FORMAT > /recordings/$VIDEO_ID/$VIDEO_ID.info -} -export -f function5 -if [[ $CURRENT_UID != $USER_ID ]]; then - su myuser -c "bash -c function5" -else - function5 -fi - +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 ### -function6() { - TMP=$(mktemp /recordings/$VIDEO_ID/.$VIDEO_ID.XXXXXXXXXXXXXXXXXXXXXXX.json) - INFO=$(cat /recordings/$VIDEO_ID/$VIDEO_ID.info | jq '.') - HAS_AUDIO_AUX=$(echo $INFO | jq '.streams[] | select(.codec_type == "audio")') - if [ -z "$HAS_AUDIO_AUX" ]; then HAS_AUDIO=false; else HAS_AUDIO=true; fi - HAS_VIDEO_AUX=$(echo $INFO | jq '.streams[] | select(.codec_type == "video")') - if [ -z "$HAS_VIDEO_AUX" ]; then HAS_VIDEO=false; else HAS_VIDEO=true; fi - SIZE=$(echo $INFO | jq '.format.size | tonumber') - DURATION=$(echo $INFO | jq '.format.duration | tonumber') - STATUS="stopped" - 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 -} -export -f function6 -if [[ $CURRENT_UID != $USER_ID ]]; then - su myuser -c "bash -c function6" -else - function6 -fi - +TMP=$(mktemp /recordings/$VIDEO_ID/.$VIDEO_ID.XXXXXXXXXXXXXXXXXXXXXXX.json) +INFO=$(cat /recordings/$VIDEO_ID/$VIDEO_ID.info | jq '.') +HAS_AUDIO_AUX=$(echo $INFO | jq '.streams[] | select(.codec_type == "audio")') +if [ -z "$HAS_AUDIO_AUX" ]; then HAS_AUDIO=false; else HAS_AUDIO=true; fi +HAS_VIDEO_AUX=$(echo $INFO | jq '.streams[] | select(.codec_type == "video")') +if [ -z "$HAS_VIDEO_AUX" ]; then HAS_VIDEO=false; else HAS_VIDEO=true; fi +SIZE=$(echo $INFO | jq '.format.size | tonumber') +DURATION=$(echo $INFO | jq '.format.duration | tonumber') +STATUS="stopped" +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 ### -function7() { - 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 -} -export -f function7 -if [[ $CURRENT_UID != $USER_ID ]]; then - su myuser -c "bash -c function7" -else - function7 -fi +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 + +### Change permissions to all generated files ### + +sudo chmod -R 777 /recordings/$VIDEO_ID diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java index 1e8e636e..ad1bf031 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/ComposedRecordingService.java @@ -57,7 +57,6 @@ import io.openvidu.server.config.OpenviduConfig; import io.openvidu.server.core.Session; import io.openvidu.server.recording.Recording; import io.openvidu.server.recording.RecordingInfoUtils; -import io.openvidu.server.utils.CommandExecutor; public class ComposedRecordingService extends RecordingService { @@ -92,16 +91,6 @@ public class ComposedRecordingService extends RecordingService { this.recordingManager.sessionHandler.setRecordingStarted(session.getSessionId(), recording); this.recordingManager.startingRecordings.put(recording.getId(), recording); - String uid = null; - try { - uid = System.getenv("MY_UID"); - if (uid == null) { - uid = CommandExecutor.execCommand("/bin/sh", "-c", "id -u " + System.getProperty("user.name")); - } - } catch (IOException | InterruptedException e) { - e.printStackTrace(); - } - String layoutUrl = this.getLayoutUrl(recording, this.getShortSessionId(session)); envs.add("URL=" + layoutUrl); @@ -110,7 +99,6 @@ public class ComposedRecordingService extends RecordingService { envs.add("VIDEO_ID=" + recordingId); envs.add("VIDEO_NAME=" + properties.name()); envs.add("VIDEO_FORMAT=mp4"); - envs.add("USER_ID=" + uid); envs.add("RECORDING_JSON=" + recording.toJson().toString()); log.info(recording.toJson().toString()); @@ -158,11 +146,13 @@ public class ComposedRecordingService extends RecordingService { log.warn("Session closed while starting recording container"); boolean containerClosed = false; String containerIdAux; - while (!containerClosed) { + int timeOut = 0; + while (!containerClosed && (timeOut < 30)) { containerIdAux = this.sessionsContainers.remove(session.getSessionId()); if (containerIdAux == null) { try { log.warn("Waiting for container to be launched..."); + timeOut++; Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace();