diff --git a/Dockerfile b/Dockerfile index 3bb946e4b547853873a52b6cae3b4fc9706ae978..cf5a6275eb4ef2798212039c0995ddd1759d54f6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,18 @@ -FROM python:3 +ARG FFMPEG_VERSION=4.2.2 -WORKDIR /usr/src/app +FROM ubuntu:bionic +ARG FFMPEG_VERSION -COPY py_requirements.txt ./ +WORKDIR /usr/src/app -RUN pip install --no-cache-dir -r py_requirements.txt +RUN apt-get update && apt-get install -y software-properties-common && apt-get update && add-apt-repository ppa:jonathonf/ffmpeg-4 RUN apt-get update && apt-get install -y \ + python3-pip \ + python3-dev \ xvfb \ - ffmpeg \ fluxbox \ + ffmpeg \ dbus-x11 \ libasound2 \ libasound2-plugins\ @@ -18,6 +21,15 @@ RUN apt-get update && apt-get install -y \ pulseaudio \ pulseaudio-utils +RUN ln -s /usr/bin/python3 /usr/local/bin/python \ + && pip3 install --upgrade pip + +COPY py_requirements.txt ./ + +RUN pip install --no-cache-dir -r py_requirements.txt + + + RUN apt-get update && \ apt-get install -y gnupg wget curl unzip --no-install-recommends && \ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ @@ -33,6 +45,7 @@ RUN apt-get update && \ ENV BBB_AS_MODERATOR false ENV BBB_USER_NAME Live ENV BBB_CHAT_NAME Chat +ENV BBB_SHOW_CHAT false ENV BBB_ENABLE_CHAT false ENV BBB_REDIS_HOST redis ENV BBB_REDIS_CHANNEL chat diff --git a/startStream.sh b/startStream.sh index 7bd8c89ff4610a6cb85eac5415ea4f47cee03e23..8aed46c5a5bd78522d51cd85d75b7bc3e603859a 100644 --- a/startStream.sh +++ b/startStream.sh @@ -4,7 +4,13 @@ JOIN_AS_MODERATOR=""; if [ "${BBB_AS_MODERATOR}" = "true" ] then JOIN_AS_MODERATOR="-m"; -fi +fi + +SHOW_CHAT=""; +if [ "${BBB_SHOW_CHAT}" = "true" ] +then + SHOW_CHAT="-c"; +fi if [ "${BBB_ENABLE_CHAT}" = "true" ] then @@ -12,4 +18,4 @@ then sleep 10 fi -xvfb-run -n 122 --server-args="-screen 0 1920x1080x24" python3 stream.py -s ${BBB_URL} -p ${BBB_SECRET} -i ${BBB_MEETING_ID} -t ${BBB_STREAM_URL} -u ${BBB_USER_NAME} $JOIN_AS_MODERATOR; +xvfb-run -n 122 --server-args="-screen 0 1920x1080x24" python3 stream.py -s ${BBB_URL} -p ${BBB_SECRET} -i ${BBB_MEETING_ID} -t ${BBB_STREAM_URL} -u ${BBB_USER_NAME} ${SHOW_CHAT} $JOIN_AS_MODERATOR; diff --git a/stream.py b/stream.py index 48dc7ec51f0893fc665144ff0208b1267e565c8f..bf17bafc07315388af1c68f2d17e4f3878cd1c77 100644 --- a/stream.py +++ b/stream.py @@ -25,6 +25,7 @@ parser.add_argument("-i","--id", help="Big Blue Button Meeting ID") parser.add_argument("-m","--moderator", help="Join the meeting as moderator",action="store_true") parser.add_argument("-u","--user", help="Name to join the meeting",default="Live") parser.add_argument("-t","--target", help="RTMP Streaming URL") +parser.add_argument("-c","--chat", help="Show the chat",action="store_true") args = parser.parse_args() bbb = BigBlueButton(args.server,args.secret) @@ -60,8 +61,13 @@ def bbb_browser(): WebDriverWait(browser, selelnium_timeout).until(element) browser.find_element_by_id('message-input').send_keys("This meeting will be stream to the following address: %s" % args.target) browser.find_elements_by_css_selector('[aria-label="Send message"]')[0].click() - browser.find_elements_by_id('chat-toggle-button')[0].click() - browser.find_elements_by_css_selector('button[aria-label="Users and messages toggle"]')[0].click() + + if args.chat: + browser.execute_script("document.querySelector('[aria-label=\"User list\"]').parentElement.style.display='none';") + else: + browser.find_elements_by_id('chat-toggle-button')[0].click() + browser.find_elements_by_css_selector('button[aria-label="Users and messages toggle"]')[0].click() + browser.execute_script("document.querySelector('[aria-label=\"Users and messages toggle\"]').style.display='none';") browser.execute_script("document.querySelector('[aria-label=\"Options\"]').style.display='none';") browser.execute_script("document.querySelector('[aria-label=\"Actions bar\"]').style.display='none';") @@ -82,8 +88,8 @@ def watch(): def stream(): audio_options = '-f alsa -i pulse -ac 2 -c:a aac -b:a 160k -ar 44100' #video_options = ' -c:v libvpx-vp9 -b:v 2000k -crf 33 -quality realtime -speed 5' - video_options = '-c:v libx264 -x264-params "nal-hrd=cbr" -vf format=yuv420p -b:v 4000k -g 60 -preset ultrafast -tune zerolatency' - ffmpeg_stream = 'ffmpeg -thread_queue_size 512 -f x11grab -draw_mouse 0 -s 1920x1080 -i :%d %s -threads 0 %s -f flv "%s"' % ( 122, audio_options, video_options, args.target) + video_options = '-c:v libx264 -x264-params "nal-hrd=cbr" -profile:v high -level:v 4.2 -vf format=yuv420p -b:v 4000k -maxrate 4000k -minrate 2000k -bufsize 8000k -g 60 -preset ultrafast -tune zerolatency' + ffmpeg_stream = 'ffmpeg -thread_queue_size 1024 -f x11grab -draw_mouse 0 -s 1920x1080 -i :%d %s -threads 0 %s -f flv -flvflags no_duration_filesize "%s"' % ( 122, audio_options, video_options, args.target) ffmpeg_args = shlex.split(ffmpeg_stream) p = subprocess.Popen(ffmpeg_args)