docker icon indicating copy to clipboard operation
docker copied to clipboard

Add another recording playback formats like "video"

Open niels-heinemann opened this issue 3 months ago • 3 comments

Hey! First I have to say thank you for this cool docker setup and your work!

How can I enable "video" recording format accordng to the docs? I followed those docs but there's no way to install the scripts ("The processing scripts and playback support files for these recording formats can be installed from the packages named bbb-playback-formatname (e.g. bbb-playback-video)")

So I enriched the docker-compose template for recordngs service to read

      additional_contexts:
        - record-core=./repos/bigbluebutton/record-and-playback/core
        - presentation=./repos/bigbluebutton/record-and-playback/presentation
        - video=./repos/bigbluebutton/record-and-playback/video  <--------------------------------------------------  Added
        - bbb-conf=./repos/bigbluebutton/bigbluebutton-config

and changed the recordings Dockerfile to

COPY --from=presentation /scripts /usr/local/bigbluebutton/core/scripts/ COPY --from=video /scripts /usr/local/bigbluebutton/core/scripts/

But processing fails with a stacktrace which does not tell me why. See

recordings-1  | E, [2025-10-12T18:57:39.617941 #1395] ERROR -- : Process format failed for 04cb752b7d1d824eb24a34423f6fd2e5a4f019db-1757408683004:video
recordings-1  | I, [2025-10-12T18:57:39.618354 #1395]  INFO -- : Process took 606ms
recordings-1  | I, [2025-10-12T18:57:39.618420 #1395]  INFO -- : Ended worker process for 04cb752b7d1d824eb24a34423f6fd2e5a4f019db-1757408683004 with result false
recordings-1  | E, [2025-10-12T18:57:39.618591 #1395] ERROR -- : Worker process for 04cb752b7d1d824eb24a34423f6fd2e5a4f019db-1757408683004 failed with result false
recordings-1  | E, [2025-10-12T18:57:39.618773 #1395] ERROR -- : /usr/local/bigbluebutton/core/lib/recordandplayback/workers/base_worker.rb:56:in `perform'
recordings-1  | E, [2025-10-12T18:57:39.618805 #1395] ERROR -- : /usr/local/bigbluebutton/core/lib/recordandplayback/workers/process_worker.rb:26:in `perform'
recordings-1  | E, [2025-10-12T18:57:39.618863 #1395] ERROR -- : /usr/local/bigbluebutton/core/lib/recordandplayback/workers/base_worker.rb:44:in `perform'
recordings-1  | E, [2025-10-12T18:57:39.618890 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/job.rb:168:in `perform'
recordings-1  | E, [2025-10-12T18:57:39.618917 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:322:in `perform'
recordings-1  | E, [2025-10-12T18:57:39.618952 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:922:in `block in perform_with_fork'
recordings-1  | E, [2025-10-12T18:57:39.618976 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:920:in `fork'
recordings-1  | E, [2025-10-12T18:57:39.619008 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:920:in `perform_with_fork'
recordings-1  | E, [2025-10-12T18:57:39.619032 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:278:in `work_one_job'
recordings-1  | E, [2025-10-12T18:57:39.619062 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:249:in `block in work'
recordings-1  | E, [2025-10-12T18:57:39.619085 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:246:in `loop'
recordings-1  | E, [2025-10-12T18:57:39.619106 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/worker.rb:246:in `work'
recordings-1  | E, [2025-10-12T18:57:39.619129 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/resque-2.6.0/lib/resque/tasks.rb:20:in `block (2 levels) in <top (required)>'
recordings-1  | E, [2025-10-12T18:57:39.619165 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute'
recordings-1  | E, [2025-10-12T18:57:39.619189 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `each'
recordings-1  | E, [2025-10-12T18:57:39.619211 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute'
recordings-1  | E, [2025-10-12T18:57:39.619255 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
recordings-1  | E, [2025-10-12T18:57:39.619291 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
recordings-1  | E, [2025-10-12T18:57:39.619334 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
recordings-1  | E, [2025-10-12T18:57:39.619385 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke'
recordings-1  | E, [2025-10-12T18:57:39.619421 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task'
recordings-1  | E, [2025-10-12T18:57:39.619486 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level'
recordings-1  | E, [2025-10-12T18:57:39.619527 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each'
recordings-1  | E, [2025-10-12T18:57:39.619564 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level'
recordings-1  | E, [2025-10-12T18:57:39.619600 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads'
recordings-1  | E, [2025-10-12T18:57:39.619637 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level'
recordings-1  | E, [2025-10-12T18:57:39.619671 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run'
recordings-1  | E, [2025-10-12T18:57:39.619704 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
recordings-1  | E, [2025-10-12T18:57:39.619750 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
recordings-1  | E, [2025-10-12T18:57:39.619800 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
recordings-1  | E, [2025-10-12T18:57:39.619842 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/bin/rake:25:in `load'
recordings-1  | E, [2025-10-12T18:57:39.619883 #1395] ERROR -- : /usr/local/bigbluebutton/core/vendor/bundle/ruby/3.0.0/bin/rake:25:in `<main>'
recordings-1  | E, [2025-10-12T18:57:39.620207 #1395] ERROR -- : (Job{rap:process} | BigBlueButton::Resque::ProcessWorker | [{"meeting_id"=>"04cb752b7d1d824eb24a34423f6fd2e5a4f019db-1757408683004", "single_step"=>false, "format_name"=>"video"}]) failed: #<RuntimeError: Worker process for 04cb752b7d1d824eb24a34423f6fd2e5a4f019db-1757408683004 failed with result false>

Can you help me out? What am I missing?

niels-heinemann avatar Oct 12 '25 19:10 niels-heinemann

I've almost the same issue but with screenshare I manually added the screenshare workflow to the recordings container. As I found in recordings logfile - the postprocessor can not find recordings files of screenshare in my case to combine them.

So it seems that there is no raw data recorded and nothing to postprocess...

I'm in search of solution

daboriginal avatar Oct 15 '25 08:10 daboriginal

and I've found it @niels-heinemann I've done changes like You mentioned to docker-compose and recordings Dockerfile then I've rebuilt the recordings container with docker compose build recordings

than I put compose down and up with new recordings-image

daboriginal avatar Oct 15 '25 09:10 daboriginal

The trick is, not only adding the scripts for the recording processing, u need also the playback files:

but first the error u get is this (see ur last line)

recordings-1 | E, [2025-10-12T18:57:39.620207 #1395] ERROR -- : (Job{rap:process} | BigBlueButton::Resque::ProcessWorker | [{"meeting_id"=>"04cb752b7d1d824eb24a34423f6fd2e5a4f019db-1757408683004", "single_step"=>false, "format_name"=>"video"}]) failed: #<RuntimeError: Worker process for 04cb752b7d1d824eb24a34423f6fd2e5a4f019db-1757408683004 failed with result false>

But before this error is thrown you should see an INFO in the log like -> missing file:

recordings-1 | I, [2024-07-30T16:30:54.014241 #309955] INFO -- : /usr/local/bigbluebutton/core/scripts/process/video.rb:264:in `read': No such file or directory @ rb_sysopen - /usr/local/bigbluebutton/core/playback/video/index.html.erb (Errno::ENOENT)

Little How-To without image rebuild, but with the disadvantage that it is not container "recreate" safe

documentation for the plain installation; https://docs.bigbluebutton.org/administration/customize/#install-additional-recording-processing-formats

  1. copy the recordings scripts inside the container
docker compose cp bigbluebutton/record-and-playback/notes/scripts recordings:/usr/local/bigbluebutton/core
docker compose cp bigbluebutton/record-and-playback/screenshare/scripts recordings:/usr/local/bigbluebutton/core/
docker compose cp bigbluebutton/record-and-playback/podcast/scripts recordings:/usr/local/bigbluebutton/core
docker compose cp bigbluebutton/record-and-playback/video/scripts recordings:/usr/local/bigbluebutton/core
  1. copy the playback files inside the container
docker compose cp bigbluebutton/record-and-playback/notes/playback recordings:/usr/local/bigbluebutton/core    #atm none 
docker compose cp bigbluebutton/record-and-playback/screenshare/playback recordings:/usr/local/bigbluebutton/core
docker compose cp bigbluebutton/record-and-playback/podcast/playback recordings:/usr/local/bigbluebutton/core    #atm none 
docker compose cp bigbluebutton/record-and-playback/video/playback recordings:/usr/local/bigbluebutton/core
docker compose cp bigbluebutton/record-and-playback/presentation/playback recordings:/usr/local/bigbluebutton/core
docker compose cp bigbluebutton/record-and-playback/slides/playback recordings:/usr/local/bigbluebutton/core
  1. adjust the premissions for the folders scripts and playback docker compose exec recordings chown 998:998 -R /usr/local/bigbluebutton/core/scripts /usr/local/bigbluebutton/core/playback

  2. enable a new format, like video. Edit your recording.yml on the docker host, path to this file is ./mod/recording/recording.yml

steps: archive: "sanity" sanity: "captions" captions: - "process:presentation" - "process:video" # added "process:presentation": "publish:presentation" "process:video": "publish:video" #added, optional, without this, it shouldn't necessary to copy the playback files, not tested.

  1. map the recording.yml as recording.yml.tmpl so that the dockerized approach take our new file to create the recording.yml. (details, see the entrypoint.sh under /mod/recordings:

recording: ... volumes: - ./mod/recording/recording.yml:/etc/bigbluebutton/recording/recording.yml.tmpl ...

the following commands run inside the recording container, so open a shell with docker compose exec -it recording /bin/bash

  1. (optional) if u want to change the resolution for the resulting video, default is 1280x720, edit maybe directly inside the container the following file: /usr/local/bigbluebutton/core/scripts/video.yml

  2. (optional) if u want to change codec settings, edit also the following file (same folder) /usr/local/bigbluebutton/core/scripts/screenshare.yml

  3. restart the services inside the container #the services are defined in /etc/supervisor/conf.d/supervisord.conf

supervisorctl restart rap_starter:
supervisorctl restart rasque_workers:
supervisorctl restart rap_caption_inbox:
  1. u will still see errors in the log, because we have to create the necessary log files and log paths
  • first check which files/folders are missing bbb-record --check
  • create all missing files/folders listed, normally if u add all recording formats:
mkdir /var/log/bigbluebutton/notes
mkdir /var/log/bigbluebutton/podcast
mkdir /var/log/bigbluebutton/screenshare
mkdir /var/log/bigbluebutton/video

touch /var/log/bigbluebutton/bbb-rap-worker.log
touch /var/log/bigbluebutton/post_process.log
touch /var/log/bigbluebutton/bbb-recording-cleanup.log
  • adjust permissions chown 998:998 -R /var/log/bigbluebutton
  1. verify if the new formats are available now bbb-record --list-workflows

  2. (optional) rebuild all recordings or one

bbb-record --rebuild-all

#get id
bbb-record --list
bbb-record --rebuild <id>
  1. (optional) disable workflow presentation
bbb-record --disable presentation  #this renames the file presentation.rb to presentation.rb.bk under  /usr/local/bigbluebutton/core/scripts/process/
bbb-record --list-workflows

ben-ba avatar Oct 22 '25 09:10 ben-ba

One more thing In screenshare process script-file you need to change this line props = YAML::load(File.open(File.expand_path('../../bigbluebutton.yml', __FILE__))) to this props = BigBlueButton.read_props like it is in presentation process file otherwise it'll publish the screenshares with 127.0.0.1 in url at metadata.xml

And one more: this line docker compose cp bigbluebutton/record-and-playback/screenshare/playback recordings:/usr/local/bigbluebutton/core should be like docker compose cp bigbluebutton/record-and-playback/screenshare/playback recordings:/usr/local/bigbluebutton/core/playback/screenshare As I saw it could be the same for video scripts.

Unfortunately method from @ben-ba is temporary I'm trying now to make it fixed

daboriginal avatar Nov 05 '25 12:11 daboriginal