Commercial Detection Performance

I’m wondering what experience others are having with commercial detection. For me, it seems to work maybe 50% of the time. For a single show it might catch a whole segment, then for the next set it will remove maybe half the commercials, and sometimes it won’t catch any commercials at all.
Since there’s no options to change how it works, I guess there’s not much I can do about it, just curious if others have better experience or that’s just how it is right now.

@Plocmstart That sounds exactly the same experience that I’ve had with it. When it works it’s okay, but most of the time it either works a little or not at all. It’s a shame, as if it worked at around 90% of the time it would be good, let alone 100%.

I hope Plex can get this feature working fully in the future.

I suspect it’s a repackaged Comskip by the author here

There are lots of configuration options including adding more threads available. there is a forum here about it.

From my compiler fuzzing it has quite a few buffer overflows. I reported it to security@plex as well as the main developer with no response. I asked for plex’s patches since this is GPL-2 based and have yet to hear back. So it might be a license violation on plex inc’s part, too.

That’s a good point on the number of threads. When I was benchmarking it, seems like it would take 7-8 minutes to analyze an hour worth of video. I’m running this on a 28-core system and it looks like it’s only using a small fraction of it. Don’t know if it could also take advantage of hardware decode to accelerate the pipeline, improvement might be negligible there though.

It uses comsckip and you can change the configuration. You need to create a DVR folder in the \PlexMediaServer\Library\Application Support\Plex Media Server\ folder and put your comskip.ini file there. Mine picks up probably 95% or better. I have Xfinity so not sure if it works for other carriers. You can find config files online that may work for you. My ini contents are below:

; Last modified: 1:32 AM 12/16/2010
; comskip v0.80.039
;
;[Main Settings]
detect_method=255 ; 1=black frame, 2=logo, 4=scene change, 8=fuzzy logic, 16=closed captions, 32=aspect ration, 64=silence, 128=cutscenes, 255=all
verbose=5 ; 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)
maxbright=1
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=20 ; maximum average brightness for a dim frame to be considered black (scale 0 to 255) 0 means autosetting
max_commercialbreak=305 ; 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
max_commercial_size=65 ; maximum time in seconds for a single commercial or multiple commercials if no breaks in between
min_commercial_size=14 ; mimimum time in seconds for a single commercial
min_show_segment_length=291 ; any segment longer than this will be scored towards show.
max_volume=0 ; any frame with sound volume larger than this will not be regarded as black frame
non_uniformity=250 ; Set to 0 to disable cutpoints based on uniform frames
thread_count=4
;
;[Detailed Settings]
min_silence=20 ; Any deep silence longer than this amount of frames is a possible cutpoint
noise_level=5
brightness_jump=200
fps=25
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.
global_threshold=1.05
disable_heuristics=255 ; bit pattern for disabling heuristics, adding 1 disables heristics 1, adding 2 disables heristics 2, adding 4 disables heristics 3, 255 disables all heuristics
;
;[CPU Load Reduction]
play_nice_start=0000 ; at what time of the day should comskip slow itself down
play_nice_end=0000 ; ending time for self slowing
play_nice_sleep=30
;
;[Input Correction]
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.
ms_audio_delay=5
volume_slip=20
variable_bitrate=1
;
;[Aspect Ratio]
ar_delta=0.08
cut_on_ar_change=2 ; 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
;
;[Global Removes]
padding=0
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
added_recording=14
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
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
min_commercial_break_at_start_or_end=39
always_keep_first_seconds=0
always_keep_last_seconds=0
;
;[USA Specific]
intelligent_brightness=1 ; Set to 1 to use a USA specific algorithm to tune some of the settings, not adviced outside the USA
black_percentile=0.0076
uniform_percentile=0.003
score_percentile=0.71
;
;[Main Scoring]
length_strict_modifier=3
length_nonstrict_modifier=1.5
combined_length_strict_modifier=2
combined_length_nonstrict_modifier=1.25
ar_wrong_modifier=2
excessive_length_modifier=0.01
dark_block_modifier=0.3
min_schange_modifier=0.5
max_schange_modifier=2
logo_present_modifier=0.01
punish_no_logo=1 ; Default, set to 0 to avoid show segments without logo to be scored towards commercial
;
;[Detailed Scoring]
punish=0 ; Compare to average for sum of 1=brightness, 2=uniform 4=volume, 8=silence, 16=schange, set to 0 to disable
reward=0
punish_threshold=1.3 ; Multiply when amount is above average * punish_threshold
punish_modifier=2 ; When above average * threshold multiply score by this value
reward_modifier=0.5
;
;[Logo Finding]
border=10 ; border around edge of video to ignore
give_up_logo_search=5000
logo_max_percentage_of_screen=0.15
ticker_tape=0 ; Amount of pixels from bottom to ignore in all processing
ignore_side=0
subtitles=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
logo_threshold=0.70
logo_filter=0 ; set the size of the filter to apply to bad logo detection, 4 seems to be a good value.
aggressive_logo_rejection=1
edge_level_threshold=5
edge_radius=2
edge_weight=10
edge_step=1
num_logo_buffers=50
use_existing_logo_file=1
two_pass_logo=1
;
;[Logo Interpretation]
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
logo_percentile=0.92 ; if more then this amount of logo is found then logo detection will be disabled
logo_fraction=0.4
shrink_logo=5 ; Reduce the duration of the logo with this amount of seconds
before_logo=0
after_logo=0 ; set to number of seconds after logo disappears comskip should start to search for silence to insert an additional cutpoint
where_logo=0
min_black_frames_for_break=1 ;
;
;[Closed Captioning]
ccCheck=1
cc_commercial_type_modifier=4
cc_wrong_type_modifier=2
cc_correct_type_modifier=0.75
;
;[Live TV]
live_tv=0 ; set to 1 if you use parallelprocessing and need the output while recording
live_tv_retries=4 ; 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
dvrmsstandoff=120000
require_div5=0
div5_tolerance=-1
;
;[Output Control]
output_default=0 ; output the default .txt file
output_plist_cutlist=0
output_zoomplayer_cutlist=0
output_zoomplayer_chapter=0
output_vcf=0
output_vdr=0 ; set to 1 if you want XBMC to skipping commercials
output_projectx=0 ; set to 1 if you want ProjectX cutlist output (Xcl)
output_avisynth=0
output_videoredo=0
videoredo_offset=2
output_btv=0 ; set to 1 if you want Beyond TV chapter cutlist output
output_edl=0
edl_offset=0 ; The amount of frames subtracted from the edl cut time output, use negative numbers to shift to later.
output_edlp=0
output_bsplayer=0
output_edlx=0
output_cuttermaran=0
output_mpeg2schnitt=0
output_womble=0
output_mls=0 ; set to 1 if you want MPeg Video Wizard bookmark file output
output_mpgtx=0
output_dvrmstb=1
output_dvrcut=0
output_ipodchap=0
output_framearray=0 ; create a big excel file for detailed analysis, set to 0 to disable
output_debugwindow=0
output_tuning=0
output_training=0
output_false=0
output_aspect=0
output_demux=0 ; set to 1 if you want comskip to demux the mpeg file while scanning
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_srt=0 ; set to 1 if you want to generate a .srt file, done by integrating ccextractorwin
output_smi=0 ; set to 1 if you want to generate a .smi file, done by integrating ccextractorwin
output_timing=0
delete_logo_file=1 ; set to 1 if you want comskip to tidy up after finishing
;
;[Cutscene processing]
cutscene_frame=0
cutscene_dumpfile=“”
cutscene_threshold=10
cutscenefile1=“”
cutscenefile2=“”
cutscenefile3=“”
cutscenefile4=“”
cutscenefile5=“”
cutscenefile6=“”
cutscenefile7=“”
cutscenefile8=“”
windowtitle=“Comskip - %s”
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") \nMPEG2Source("%s")\n”
dvrcut_options="dvrcut "%s.dvr-ms" "%s_clean.dvr-ms" "
;
;[Sage Workarounds]
sage_framenumber_bug=0
sage_minute_bug=0
enable_mencoder_pts=0
;
;[Outdated parameters]
skip_b_frames=0 ; Set to 1 to force Comskip to skip frames for higher processing speed.

Thanks for that. I also found this support article: Removing Commercials | Plex Support

I’m using OTA recordings only, and this will give me plenty to try tuning the performance.

I’m going to give this a try. I have very mixed results with commercial skip. I’ve made it a point to turn it off for PBS shows since they don’t have commercials but comskip would screw up the intros and outros. For my other OTA channels, there are good days and bad days. The one that usually drives me nuts is The Simpsons. It most often cuts off the entire episode credits, so I never can see who the guest voices are.