Add another recording playback formats like "video"
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?
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
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
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
- 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
- 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
-
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 -
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.
- 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
-
(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 -
(optional) if u want to change codec settings, edit also the following file (same folder)
/usr/local/bigbluebutton/core/scripts/screenshare.yml -
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:
- 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
-
verify if the new formats are available now
bbb-record --list-workflows -
(optional) rebuild all recordings or one
bbb-record --rebuild-all
#get id
bbb-record --list
bbb-record --rebuild <id>
- (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
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