Post-Processing

The post-processing gives you the possibility to execute different actions after a recording has finished. You can use that to convert the files to another format, create preview images, rename / move the file etc.

Available Steps
  • create a copy - Creates a copy of the original recording. All following post-processing steps are executed on the copy, not on the original recording. This means, that the post-processing can be rerun in case a step failed, because the original recording is still available.

  • rename - Renames the recording with the help of variables. See Variables

  • move - Moves the recording with the help of variables. See Variables

  • remux / transcode - Executes FFmpeg with the given arguments on the recording. This step can be used to convert a recording to MP4 or re-encode it to a different format / resolution. The input and output file don't have to be defined. If the step was successful the input file gets deleted.

  • execute script - Executes a script or program with the given arguments. You can use the variables to define what to pass over to the script.

  • delete too short - Delete a recording, if it is shorter than the given duration. This post-processing step has replaced the setting, which was available in the post-processing category before

  • delete original - This is a companion step for "create a copy". If you use the copy step and all other steps are successful, you probably want to get rid of the original file and just keep the result of the post-processing. That's what this step does.

  • remove recording, but keep the files - Removes the recording from the recordings list, but keeps the files untouched.

  • create contactsheet - create a contact sheet with preview images of the recording

  • webhook - send a message via a webhook, e.g. Telegram

  • concatenate - concatenate video files created within a time period

    concatenate NOTES: If you can't live with these constraints, don't use it, don't ask "Why can't I...", come up with something better - this is NOT an exhaustive list.

    • It relies on having single files to work with, not segments, for those who use the server.

    • It relies on the metadata being available, you cannot use it with a remove recording, but keep the files step.

    • The status of EVERY file has to be FINISHED - from metadata.

    • The dimensions of EVERY video have to be the same - checked by ffmpeg.

    • It uses the creation time of the video for its selection basis - from metadata.

    • The time period is counted backwards from the completion of the current recording.

    • It will work after a rename step.

    • It won't work after a remux step if you've changed container or encoded the file - limitations of concat.

    • It is recommended that recordings don't all go into a single directory but the process should cope if they do - in theory.

    • Don't use it with delete too short for obvious reasons - no metadata.

    • Wait for post-processing to finish before rushing off to shutdown CTBRec.

    • create contactsheet will use the specifications of the original file not the concatenated replacement file.

    • contactsheets for concatenated deleted files will be left behind, live with it or don't create them - CTBRec deletes files after post-processing completes.

    • I do not recommend running multiple concurrent concatenate processes - for obvious reasons.

    • It accepts the following formats for input: MKV, TS, MP4, & MOV.

    • The most reliable recording format for it to work is MKV.

    • TS is a P.I.T.A. to concatenate, video timing values will most likely be screwed, find some better parameters and tell me.

      Format Parameters
      Default-c copy
      TS-c copy -fflags +genpts -avoid_negative_ts make_zero -bsf:a aac_adtstoasc
      MKV-c copy -map 0
      MP4/MOV-c copy -movflags +faststart

Planned for future releases

  • There is no plan ... we make it up as we go.
  • create timeline thumbnails - create a small thumbnail for every second or every few seconds, which can be used to very fast scan through a recording

How to configure the server to do post-processing

There is currently no user interface to configure the post-processing for the server. It has to be added manually to the server config. I suggest to start the app and configure the post-processing steps in the settings. Afterwards you close the app and copy the post-processing section from the settings.json to your server.json file. To find out, where these files are on your system, read Configuration File.

The part you have to copy is

  postProcessors: [
    ...
  ],

Variables

Available variables:
  • ${modelName} - the name of the recorded model
  • ${modelDisplayName} - the name of the recorded model, which is shown on the webpage. Might be the same as ${modelName}
  • ${modelGroupName} - name of the model group, if the model is part of a group
  • ${modelGroupId} - the unique ID of the model group, if the model is part of a group
  • ${siteName} - the name of the cam site, the model streams on
  • ${contactSheet} - the full path to the contactsheet if one exists
  • ${fileSuffix} - the file extension of the recording. E.g. ts or mp4. In case of a standard server recording, this will be empty
  • ${epochSecond} - timestamp of the recording in seconds since 1970-01-01 (unixtime)
  • ${modelNotes} - sanitized model notes. The following characters are replaced by an underscore: \, /, ', " and space
  • ${recordingNotes} - sanitized recording notes. The following characters are replaced by an underscore: \, /, ', " and space. Useful for the download of recordings from the server.
  • ${recordingsDir} - the base directory of all recordings. Same as Recordings Directory in the Recorder settings section.
  • ${absolutePath} - the absolute path in the filesystem to the recording file (or the recording directory in case of a server recording)
  • ${absoluteParentPath} - the absolute path to the parent directory of the recording in the filesystem (or the recording dir in case of a server recording)
  • ${utcDateTime} and ${localDateTime} - the timestamp of the recording in the UTC or your local timezone

Functions