PostProccessing: Usage Examples

OK, can someone tell me what my best and easiest (not very familiar with scripts, although willing to learn) approach to all of this would be on a windows machine?

I’m not sure yet whether I want to completely remove commercials or just add chapters so I can skip them so I would like to know how to do either.

Any help is much appreciated.

@JStandiford21 said:
OK, can someone tell me what my best and easiest (not very familiar with scripts, although willing to learn) approach to all of this would be on a windows machine?
I wrote a guide for Windows users, check it out here: https://forums.plex.tv/discussion/232730/guide-commercial-free-experience-with-plex-dvr/p1

@Wiidesire said:

@JStandiford21 said:
OK, can someone tell me what my best and easiest (not very familiar with scripts, although willing to learn) approach to all of this would be on a windows machine?
I wrote a guide for Windows users, check it out here: https://forums.plex.tv/discussion/232730/guide-commercial-free-experience-with-plex-dvr/p1

Awesome , I will try that out.

I’ve got the workflow set up… however it appears the plexcomskip python script isn’t letting comskip finish processing before performing the next steps. When I run the python script manually it works just fine, only seems to act this way when Plex calls it out in post processing. Here’s my log entry from a recorded show. Any ideas? I’ve tried having plex transcode it live to an mkv as well and that produced same results.

2016-09-17 15:00:02,536 [8ab2e5] PlexComskip got invoked from /usr/local/scripts/PlexComskip/PlexComskip.py
2016-09-17 15:00:02,607 [8ab2e5] Using session ID: 8ab2e50d-5d56-4309-ac66-560cb82a3a28
2016-09-17 15:00:02,607 [8ab2e5] Using temp dir: /tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28
2016-09-17 15:00:02,607 [8ab2e5] Using input file: /media/nas/TV SHOWS/.grab/fc660a1823e9d9b6e3a7862227b60ca642600e64/Law & Order_ Special Victims Unit (1999) - S02E08 - Taken.ts
2016-09-17 15:00:02,607 [8ab2e5] Copying file to work on it: /tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28/Law & Order_ Special Victims Unit (1999) - S02E08 - Taken.ts
2016-09-17 15:00:47,664 [8ab2e5] [comskip] Command: ['/usr/local/bin/comskip', '--output', '/tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28', '--ini', '/usr/local/scripts/PlexComskip/comskip.ini', '/tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28/Law & Order_ Special Victims Unit (1999) - S02E08 - Taken.ts']
2016-09-17 15:00:48,171 [8ab2e5] Using EDL: /tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28/Law & Order_ Special Victims Unit (1999) - S02E08 - Taken.edl
2016-09-17 15:00:48,172 [8ab2e5] Keeping segment from 0.0 to the end of the file...
2016-09-17 15:00:48,172 [8ab2e5] [ffmpeg] Command: ['/usr/bin/ffmpeg', '-i', '/tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28/Law & Order_ Special Victims Unit (1999) - S02E08 - Taken.ts', '-ss', '0.0', '-c', 'copy', 'segment-0.ts']
2016-09-17 15:00:49,835 [8ab2e5] Going to concatenate 0 files from the segment list.
2016-09-17 15:00:49,835 [8ab2e5] [ffmpeg] Command: ['/usr/bin/ffmpeg', '-y', '-f', 'concat', '-i', '/tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28/segments.txt', '-c', 'copy', '/tmp/8ab2e50d-5d56-4309-ac66-560cb82a3a28/Law & Order_ Special Victims Unit (1999) - S02E08 - Taken.ts']
2016-09-17 15:00:49,851 [8ab2e5] Sanity checking our work...
2016-09-17 15:00:49,851 [8ab2e5] Output file size was too similar (doesn't look like we did much); we won't replace the original: 2.7GB -> 2.7GB
2016-09-17 15:00:49,961 [8ab2e5] Done processing!

@filequit can you post the content of your PlexComskip.conf file?

@hthighway Here you go

root@torrentbox:/usr/local/bin# cat /usr/local/scripts/PlexComskip/PlexComskip.conf
[Helper Apps]

# Path to the comskip binary.
comskip-path: /usr/local/bin/comskip

# Path to the comskip INI file. Defaults to the same directory as the PlexComskip script.
# comskip-ini-path: ~/comskip.ini

# Path to the ffmpeg binary.
ffmpeg-path: /usr/bin/ffmpeg

[Logging]

# Log file location.
logfile-path: /var/log/PlexComskip.log

# Split the log output to the console? Useful for debugging.
console-logging: True

[File Manipulation]

# Specify a temp directory for interstitial files. This should be local, fast, and have enough free space for ~2x your largest video. Defaults to system temp location.
# temp-root: /mnt/fastdisk/tmp

# Should we copy the original file to the temp directory? Useful if disk access to the original is slower than your temp location. Defaults to False.
copy-original: True

# Always save the intermediate files? Useful for debugging. Defaults to False.
save-always: False

# Save intermediate files when something goes wrong? Also useful for debugging and less space intensive. Defaults to True.
save-forensics: True

Can you post the content of you comskip.ini

I had the default one PlexComskip came but it wasnt as good as the one I found on the comskip country INI forums (grabbed one for USA OTA.) I get the same results executing through plex post processing using the default or this one.

root@torrentbox:~# cat /usr/local/scripts/PlexComskip/comskip.ini
; See comskip.txt in the distribution zip file for many settable parameters, read manual.html, tuning.html and debugwindow.html for how to tune and debug comskip
detect_method=107         ; 1=black frame, 2=logo, 4=scene change, 8=fuzzy logic, 16=closed captions, 32=aspect ration, 64=silence, 128=cutscenes, 255=all
validate_silence=1         ; Default, set to 0 to force using this clues if selected above.
validate_uniform=1         ; Default, set to 0 to force using this clues (like pure white frames) if blackframe is selected above.
validate_scenechange=1         ; Default, set to 0 to force using this clues if selected above.
verbose=1            ; Show a lot of extra info, level 5 is also OK, set to 0 to disable
max_brightness=60               ; Frame not black if any pixels checked are greater than this (scale 0 to 255)
test_brightness=40            ; Frame not pure black if any pixels checked are greater than this, will check average brightness (scale 0 to 255)
max_avg_brightness=25         ; Maximum average brightness for a dim frame to be considered black (scale 0 to 255) 0 means autosetting
maxbright=1            ; New
brightness_jump=200         ; New
max_commercialbreak=600       ; Maximum length in seconds to consider a segment a commercial break
min_commercialbreak=21         ; Minimum length in seconds to consider a segment a commercial break, some sports require lower numbers than normal tv shows
max_commercial_size=125         ; Maximum time in seconds for a single commercial or multiple commercials if no breaks in between
min_commercial_size=4         ; Mimimum time in seconds for a single commercial
min_show_segment_length=126       ; Any segment longer than this will be scored towards show (sports and 30 minute programming), increase this to 250 for 1 hour long programming
non_uniformity=500         ; Set to 0 to disable cutpoints based on uniform frames
max_volume=500            ; Any frame with sound volume larger than this will not be regarded as black frame
max_silence=100            ;
min_silence=12            ; Any deep silence longer than this amount  of frames is a possible cutpoint
noise_level=5            ; New
ticker_tape=0            ; Amount of pixels from bottom to ignore in all processing
ignore_side=0            ; New, default 0
subtitles=0            ; New, default 0
logo_at_bottom=0         ; Set to 1 to search only for logo at the lower half of the video, do not combine with subtitle setting
use_existing_logo_file=1             ; Use logo file already created at beginning of show, default 0
two_pass_logo=1            ; New
punish=0            ; Compare to average for sum of 1=brightness, 2=uniform 4=volume, 8=silence, 16=schange, set to 0 to disable
punish_threshold=1.3         ; Multiply when amount is above average punish_threshold
punish_modifier=2         ; When above average * threshold multiply score by this value
intelligent_brightness=0       ; Set to 1 to use a USA specific algorithm to tune some of the settings, not advised outside the USA
logo_percentile=0.92         ; If more then this amount of logo is found then logo detection will be disabled
logo_threshold=0.75         ; Digital signals can be higher
min_black_frames_for_break=1      ;
punish_no_logo=1         ; Default, set to 0 to avoid show segments without logo to be scored towards commercial
aggressive_logo_rejection=0
connect_blocks_with_logo=1      ; Set to 1 if you want successive blocks with logo on the transition to be regarded as connected, set to 0 to disable
delay_logo_search=0         ;
logo_filter=2                     ; Set the size of the filter to apply to bad logo detection, 4 seems to be a good value
edge_step=2            ; New, default 1
cut_on_ar_change=1         ; Set to 1 if you want to cut also on aspect ratio changes when logo is present, set to 2 to force cuts on aspect ratio changes. set to 0 to disable
delete_show_after_last_commercial=0   ; Set to 1 if you want to delete the last block if its a show and after a commercial
delete_show_before_first_commercial=0   ; New, default 0
delete_show_before_or_after_current=0   ; Set to 1 if you want to delete the previous and the next show in the recording, this can lead to the deletion of trailers of next show
delete_block_after_commercial=0      ; Set to max size of block in seconds to be discarded, set to 0 to disable
remove_before=0            ; Amount of seconds of show to be removed before ALL commercials
remove_after=0            ; Amount of seconds of show to be removed after ALL commercials
shrink_logo=5            ; Reduce the duration of the logo with this amount of seconds
after_logo=0            ; Set to number of seconds after logo disappears comskip should start to search for silence to insert an additional cutpoint
padding=1.5
ms_audio_delay=5
volume_slip=40
skip_b_frames=0            ; Set to 1 to force Comskip to skip frames for higher processing speed.
hardware_decode=0         ; Set to 1 to enable hardware accelerated video decoding, only available in donator version
thread_count=4            ; Set to utilize Quad Core
max_repair_size=200         ; Will repair maximum 200 missing MPEG frames in the timeline, set to 0 to disable repairing for players that don't use PTS
disable_heuristics=4         ; Bit pattern for disabling heuristics, adding 1 disables heristics 1, adding 2 disables heristics 2, adding 4 disables heristics 3, 255  disables all heuristics
delete_logo_file=1         ; Set to 1 if you want comskip to tidy up after finishing
output_framearray=0         ; Create a big excel file for detailed analysis, set to 0 to disable
output_data=0            ; Create a dump of the user data channel, used for CC and XDS (such as V-Chip info). Can be use together with output_framearray to remote debug CC decoding
output_videoredo=0         ; The old videoredo format
output_videoredo3=0         ; The new videoredo v3 format
output_womble=0
output_mls=0            ; Set to 1 if you want MPEG Video Wizard bookmark file output
output_cuttermaran=0
output_mpeg2schnitt=0
output_mpgtx=0
output_dvrcut=0
output_zoomplayer_chapter=0
output_zoomplayer_cutlist=0
output_edl=1
output_dvrmstb=0         ; Set to 1 if you're running DVRMS-Toolbox
output_edlx=0
output_vcf=0
output_bsplayer=0
output_btv=0            ; Set to 1 if you want Beyond TV chapter cutlist output
output_projectx=0         ; Set to 1 if you want ProjectX cutlist output (Xcl)
output_avisynth=0
output_vdr=0            ; Set to 1 if you want XBMC to skipping commercials
output_demux=0            ; Set to 1 if you want comskip to demux the mpeg file while scanning
sage_framenumber_bug=0
sage_minute_bug=0
live_tv=1            ; Set to 1 if you use parallelprocessing and need the output while recording
live_tv_retries=2         ; Change to 16 when using live_tv in BTV, used for mpeg PS and TS
dvrms_live_tv_retries=300      ; Only used for dvr_ms
standoff=0            ; Change to 8000000 when using live_tv in BTV
cuttermaran_options="cut=\"true\" unattended=\"true\" muxResult=\"false\" snapToCutPoints=\"true\" closeApp=\"true\""
mpeg2schnitt_options="mpeg2schnitt.exe /S /E /R25  /Z %2 %1"
avisynth_options="LoadPlugin(\"MPEG2Dec3.dll\") 
MPEG2Source(\"%s\")
"
dvrcut_options="dvrcut \"%s.dvr-ms\" \"%s_clean.dvr-ms\" "
windowtitle="Comskip - %s"

What platform are you running it on?

Here’s another way to embed Chapters into the recording using ffmpeg
See: https://forums.plex.tv/discussion/233492/linux-commercial-detection

@isaacrdz I am using Debian testing (stretch)

@hthighway - thank you for this project. In your instructions, you may want to call out installing FFMPEG seperately. I installed Comskip, but don’t seem to have FFMPEG on my system. I installed libavformat-ffmpeg56 to get comskip to work. (the instructions there are pretty rough.)

Trying to understand your script, I presume you went with Python for portablility between Win/Linux. Maybe not…

My questions - is the only purpose of mkvpropedit to set the language as English? Is there a strong reason to do this?
I understand comskip then scans and outputs an edl file, correct? Then what tool do you use to strip out the commercials? ffmpeg, right? or something else? If ffmpeg, it may reinforce the need to specify which ffmpeg to install, etc.

My process plan is:

  1. Plex records everything in a recording folder, which is marked to be ignored by plex
  2. Post procesing starts, copies everything to a “toprocess” folder. Everything happens on the copied file in comskip
  3. Commercials marked by comskip
  4. Commercials stripped by ffmpeg?
  5. Completed file is put in destination.
  6. Original file in “recordings” is kept as a backup. Once the process is solidified, it can be deleted as part of the process.

Did I miss something? I ask becuase I plan to do it all with shell script, but you seem to have good insight.

@hthighway said:

@Minxster said:
Donator for MCEBuddy, not yet for Comskip due to slowness… It’s taking around 4 hours to process my shows with a Xeon E3-1240 (3.6h=ghz / 4 core)

I have a E3-1230 V2 3.3GHz, and with the donated version of Comskip, a 3 hour football game takes a about 15 minutes to complete

How are you using the donater Comskip version on Ubuntu (you mentioned running Ubuntu on another thread I believe) ?

@TheKreifi

mkvpropedit is there to set the Language to English, or to whatever language you want.
So in Plex you see Audio: English instead of Audio: Unknown

So the steps I use are:
1: use mkvpropedit to set the language to english (done in the .grab folder).
2: comskip creates the EDL file in a temp folder.
3: ffmpeg is used to stripout the commericals based on the EDL info to a temp mkv in the temp folder.
4: After that I use ffmpeg again to convert the file to h264 as well as compress it.
5: temp mkv is copied over the original file in the .grab folder

After the the postprocessing script is done and Plex then moves the file out of the grab folder to is final destination. Step 4 (compressing and converting to h264) can take a bit of time, depending on your CPU.

Regarding your proposes steps, the only issue I see is #1, Plex wants to write the recordings to an actual Plex Library.

@wolvesfan08 said:

@hthighway said:

@Minxster said:
Donator for MCEBuddy, not yet for Comskip due to slowness… It’s taking around 4 hours to process my shows with a Xeon E3-1240 (3.6h=ghz / 4 core)

I have a E3-1230 V2 3.3GHz, and with the donated version of Comskip, a 3 hour football game takes a about 15 minutes to complete

How are you using the donater Comskip version on Ubuntu (you mentioned running Ubuntu on another thread I believe) ?

./configure --enable-dontator and then make a donation to Comskip Support Forum - Index page
Now I have read where some say the linux version on github ignores that flag but in my usage it seems to work.

@hthighway said:
@TheKreifi

mkvpropedit is there to set the Language to English, or to whatever language you want.
So in Plex you see Audio: English instead of Audio: Unknown

So the steps I use are:
1: use mkvpropedit to set the language to english (done in the .grab folder).
2: comskip creates the EDL file in a temp folder.
3: ffmpeg is used to stripout the commericals based on the EDL info to a temp mkv in the temp folder.
4: After that I use ffmpeg again to convert the file to h264 as well as compress it.
5: temp mkv is copied over the original file in the .grab folder

After the the postprocessing script is done and Plex then moves the file out of the grab folder to is final destination. Step 4 (compressing and converting to h264) can take a bit of time, depending on your CPU.

Regarding your proposes steps, the only issue I see is #1, Plex wants to write the recordings to an actual Plex Library.

I asked in another thread - doesn’t Plex transcode it to x264 (or h264, i forget). What are the command line arguments you use for ffmpeg?

And yes, I agree, Plex wants to record it to an actual library. (I use Kodi as well as Plex). So the way I see, it if it is deleted from the Recording directory, then replaced with the new, commercial free one, you have a win. Plex is good at detecting file/folder changes, almost too quick.

I may write this all out in shell script to skip the python. Seems like it would be pretty quick to do it there

@TheKreifi said:
I asked in another thread - doesn’t Plex transcode it to x264 (or h264, i forget). What are the command line arguments you use for ffmpeg?

Yes the experimental transcoder setting in DVR will convert to h264, but I was occasionally getting errors with that and it does not compress the file much so for now I have it set to REMUX

For ffmpeg, this is the general syntax:
ffmpeg -i inputfile.mkv -crf 18 -map 0 -acodec copy -scodec copy -c:v libx264 -threads 0 -preset veryslow outputfile.mkv

Right now I am testing -preset medium and -crf 20

@hthighway said:
So the steps I use are:
1: use mkvpropedit to set the language to english (done in the .grab folder).
2: comskip creates the EDL file in a temp folder.
3: ffmpeg is used to stripout the commericals based on the EDL info to a temp mkv in the temp folder.
4: After that I use ffmpeg again to convert the file to h264 as well as compress it.
5: temp mkv is copied over the original file in the .grab folder

Curious, why not just do #3 and #4 in one pass?

@leschan said:

@hthighway said:
So the steps I use are:
1: use mkvpropedit to set the language to english (done in the .grab folder).
2: comskip creates the EDL file in a temp folder.
3: ffmpeg is used to stripout the commericals based on the EDL info to a temp mkv in the temp folder.
4: After that I use ffmpeg again to convert the file to h264 as well as compress it.
5: temp mkv is copied over the original file in the .grab folder

Curious, why not just do #3 and #4 in one pass?

As this was my first attempt at this I didn’t want to introduce anything that could possibly break it and haven’t had time to test combining them yet :slight_smile:

@hthighway said:

Yes the experimental transcoder setting in DVR will convert to h264, but I was occasionally getting errors with that and it does not compress the file much so for now I have it set to REMUX

For ffmpeg, this is the general syntax:
ffmpeg -i inputfile.mkv -crf 18 -map 0 -acodec copy -scodec copy -c:v libx264 -threads 0 -preset veryslow outputfile.mkv

Right now I am testing -preset medium and -crf 20

Note, when using constant quality based encoding, -crf determines the quality and -preset the file size. -crf 18 -preset veryslow and -crf 18 -preset medium will give your roughly the same picture quality. The veryslow preset will just give you a file that’s like 10-15% smaller and take hours longer to finish.

Might want to add decomb/deinterlace option, too. I know we have a bunch of channels in my area that use 1080i (e.g. CBS, NBC, CW) and if I don’t decomb when/prior to encoding, it looks awful when watched from the iPad.