# Video gaps (/docs/rules/no-video-gaps)

Reports ranges of the work area where no video clip is visible (black frames).



{/* Generated by scripts/generate-docs.ts. Do not edit. */}

| Property         | Value                                                                       |
| :--------------- | :-------------------------------------------------------------------------- |
| Id               | `no-video-gaps`                                                             |
| Category         | Static                                                                      |
| Default severity | warning                                                                     |
| Scope            | [`video-gaps`](/docs/reference/computed-scopes#video-gaps) (computed scope) |

## Options [#options]

| Option      | Type      | Default | Description                                          |
| :---------- | :-------- | :------ | :--------------------------------------------------- |
| `minFrames` | `number`  | `1`     | Gaps shorter than this many frames are not reported. |
| `leading`   | `boolean` | `true`  | Report a gap at the start of the work area.          |
| `trailing`  | `boolean` | `true`  | Report a gap at the end of the work area.            |

## Customize it [#customize-it]

Turn the rule on or off in the panel's Rules settings. To change its options, severity or wording, open it with its cogwheel in the rule editor and save: your copy replaces the built-in rule until you revert it. You can also copy the file below into your rules folder as `no-video-gaps.rule.json` and edit it. See [Change a built-in rule](/docs/editor/saving#change-a-built-in-rule).

## Rule file [#rule-file]

```json title="no-video-gaps.rule.json"
{
  "formatVersion": 1,
  "id": "no-video-gaps",
  "name": {
    "en_US": "Video gaps",
    "de_DE": "Videolücken",
    "es_ES": "Huecos de vídeo",
    "fr_FR": "Blancs vidéo",
    "it_IT": "Vuoti video",
    "ja_JP": "ビデオの欠落",
    "ko_KR": "비디오 간격",
    "pt_BR": "Lacunas de vídeo",
    "ru_RU": "Пропуски видео",
    "zh_CN": "视频间隙"
  },
  "description": {
    "en_US": "Reports ranges of the work area where no video clip is visible (black frames).",
    "de_DE": "Meldet Bereiche des Arbeitsbereichs, in denen kein Videoclip sichtbar ist (Schwarzbild).",
    "es_ES": "Detecta intervalos del área de trabajo en los que no se ve ningún clip de vídeo (fotogramas en negro).",
    "fr_FR": "Signale les plages de la zone de travail où aucun élément vidéo n'est visible (images noires).",
    "it_IT": "Segnala gli intervalli dell'area di lavoro in cui nessuna clip video è visibile (fotogrammi neri).",
    "ja_JP": "ワークエリア内で、表示されるビデオクリップがない範囲（黒いフレーム）を報告します。",
    "ko_KR": "작업 영역에서 보이는 비디오 클립이 없는 구간(검은 프레임)을 보고합니다.",
    "pt_BR": "Relata intervalos da área de trabalho em que nenhum clipe de vídeo é visível (quadros pretos).",
    "ru_RU": "Сообщает об участках рабочей области, где не видно ни одного видеоклипа (черные кадры).",
    "zh_CN": "报告工作区域中没有可见视频剪辑的范围（黑帧）。"
  },
  "category": "static",
  "scope": "video-gaps",
  "severity": "warning",
  "options": {
    "minFrames": {
      "type": "number",
      "default": 1,
      "description": "Gaps shorter than this many frames are not reported."
    },
    "leading": {
      "type": "boolean",
      "default": true,
      "description": "Report a gap at the start of the work area."
    },
    "trailing": {
      "type": "boolean",
      "default": true,
      "description": "Report a gap at the end of the work area."
    }
  },
  "checks": [
    {
      "condition": {
        "all": [
          {
            "field": "gap.durationFrames",
            "operator": "greaterThanOrEqual",
            "value": {
              "field": "options.minFrames"
            }
          },
          {
            "any": [
              {
                "field": "gap.kind",
                "operator": "equals",
                "value": "inner"
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "leading"
                  },
                  {
                    "field": "options.leading",
                    "operator": "equals",
                    "value": true
                  }
                ]
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "trailing"
                  },
                  {
                    "field": "options.trailing",
                    "operator": "equals",
                    "value": true
                  }
                ]
              }
            ]
          },
          {
            "all": [
              {
                "field": "gap.hasBefore",
                "operator": "equals",
                "value": true
              },
              {
                "field": "gap.hasAfter",
                "operator": "equals",
                "value": true
              }
            ]
          }
        ]
      },
      "message": {
        "en_US": "Black video for {labels.duration} ({gap.startTimecode} to {gap.endTimecode}) between \"{gap.beforeName}\" on {gap.beforeTrack} and \"{gap.afterName}\" on {gap.afterTrack}.",
        "de_DE": "Schwarzbild für {labels.duration} ({gap.startTimecode} bis {gap.endTimecode}) zwischen „{gap.beforeName}“ auf {gap.beforeTrack} und „{gap.afterName}“ auf {gap.afterTrack}.",
        "es_ES": "Vídeo en negro durante {labels.duration} (de {gap.startTimecode} a {gap.endTimecode}) entre \"{gap.beforeName}\" en {gap.beforeTrack} y \"{gap.afterName}\" en {gap.afterTrack}.",
        "fr_FR": "Vidéo noire pendant {labels.duration} ({gap.startTimecode} à {gap.endTimecode}) entre « {gap.beforeName} » sur {gap.beforeTrack} et « {gap.afterName} » sur {gap.afterTrack}.",
        "it_IT": "Video nero per {labels.duration} (da {gap.startTimecode} a {gap.endTimecode}) tra \"{gap.beforeName}\" su {gap.beforeTrack} e \"{gap.afterName}\" su {gap.afterTrack}.",
        "ja_JP": "「{gap.beforeName}」（{gap.beforeTrack}）と「{gap.afterName}」（{gap.afterTrack}）の間に{labels.duration}の黒いビデオがあります（{gap.startTimecode}～{gap.endTimecode}）。",
        "ko_KR": "{labels.duration} 동안 검은 화면({gap.startTimecode}~{gap.endTimecode}): {gap.beforeTrack}의 \"{gap.beforeName}\" 뒤, {gap.afterTrack}의 \"{gap.afterName}\" 앞.",
        "pt_BR": "Vídeo preto por {labels.duration} ({gap.startTimecode} a {gap.endTimecode}) entre \"{gap.beforeName}\" em {gap.beforeTrack} e \"{gap.afterName}\" em {gap.afterTrack}.",
        "ru_RU": "Черный экран в течение {labels.duration} (с {gap.startTimecode} по {gap.endTimecode}) между «{gap.beforeName}» на {gap.beforeTrack} и «{gap.afterName}» на {gap.afterTrack}.",
        "zh_CN": "{labels.duration} 黑场视频（{gap.startTimecode} 至 {gap.endTimecode}），位于 {gap.beforeTrack} 上的“{gap.beforeName}” 和 {gap.afterTrack} 上的“{gap.afterName}” 之间。"
      }
    },
    {
      "condition": {
        "all": [
          {
            "field": "gap.durationFrames",
            "operator": "greaterThanOrEqual",
            "value": {
              "field": "options.minFrames"
            }
          },
          {
            "any": [
              {
                "field": "gap.kind",
                "operator": "equals",
                "value": "inner"
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "leading"
                  },
                  {
                    "field": "options.leading",
                    "operator": "equals",
                    "value": true
                  }
                ]
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "trailing"
                  },
                  {
                    "field": "options.trailing",
                    "operator": "equals",
                    "value": true
                  }
                ]
              }
            ]
          },
          {
            "all": [
              {
                "field": "gap.hasBefore",
                "operator": "equals",
                "value": false
              },
              {
                "field": "gap.hasAfter",
                "operator": "equals",
                "value": true
              }
            ]
          }
        ]
      },
      "message": {
        "en_US": "Black video for {labels.duration} ({gap.startTimecode} to {gap.endTimecode}) before \"{gap.afterName}\" on {gap.afterTrack}.",
        "de_DE": "Schwarzbild für {labels.duration} ({gap.startTimecode} bis {gap.endTimecode}) vor „{gap.afterName}“ auf {gap.afterTrack}.",
        "es_ES": "Vídeo en negro durante {labels.duration} (de {gap.startTimecode} a {gap.endTimecode}) antes de \"{gap.afterName}\" en {gap.afterTrack}.",
        "fr_FR": "Vidéo noire pendant {labels.duration} ({gap.startTimecode} à {gap.endTimecode}) avant « {gap.afterName} » sur {gap.afterTrack}.",
        "it_IT": "Video nero per {labels.duration} (da {gap.startTimecode} a {gap.endTimecode}) prima di \"{gap.afterName}\" su {gap.afterTrack}.",
        "ja_JP": "「{gap.afterName}」（{gap.afterTrack}）の前に{labels.duration}の黒いビデオがあります（{gap.startTimecode}～{gap.endTimecode}）。",
        "ko_KR": "{labels.duration} 동안 검은 화면({gap.startTimecode}~{gap.endTimecode}): {gap.afterTrack}의 \"{gap.afterName}\" 앞.",
        "pt_BR": "Vídeo preto por {labels.duration} ({gap.startTimecode} a {gap.endTimecode}) antes de \"{gap.afterName}\" em {gap.afterTrack}.",
        "ru_RU": "Черный экран в течение {labels.duration} (с {gap.startTimecode} по {gap.endTimecode}) перед «{gap.afterName}» на {gap.afterTrack}.",
        "zh_CN": "{labels.duration} 黑场视频（{gap.startTimecode} 至 {gap.endTimecode}），位于 {gap.afterTrack} 上的“{gap.afterName}” 之前。"
      }
    },
    {
      "condition": {
        "all": [
          {
            "field": "gap.durationFrames",
            "operator": "greaterThanOrEqual",
            "value": {
              "field": "options.minFrames"
            }
          },
          {
            "any": [
              {
                "field": "gap.kind",
                "operator": "equals",
                "value": "inner"
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "leading"
                  },
                  {
                    "field": "options.leading",
                    "operator": "equals",
                    "value": true
                  }
                ]
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "trailing"
                  },
                  {
                    "field": "options.trailing",
                    "operator": "equals",
                    "value": true
                  }
                ]
              }
            ]
          },
          {
            "all": [
              {
                "field": "gap.hasBefore",
                "operator": "equals",
                "value": true
              },
              {
                "field": "gap.hasAfter",
                "operator": "equals",
                "value": false
              }
            ]
          }
        ]
      },
      "message": {
        "en_US": "Black video for {labels.duration} ({gap.startTimecode} to {gap.endTimecode}) after \"{gap.beforeName}\" on {gap.beforeTrack}.",
        "de_DE": "Schwarzbild für {labels.duration} ({gap.startTimecode} bis {gap.endTimecode}) nach „{gap.beforeName}“ auf {gap.beforeTrack}.",
        "es_ES": "Vídeo en negro durante {labels.duration} (de {gap.startTimecode} a {gap.endTimecode}) después de \"{gap.beforeName}\" en {gap.beforeTrack}.",
        "fr_FR": "Vidéo noire pendant {labels.duration} ({gap.startTimecode} à {gap.endTimecode}) après « {gap.beforeName} » sur {gap.beforeTrack}.",
        "it_IT": "Video nero per {labels.duration} (da {gap.startTimecode} a {gap.endTimecode}) dopo \"{gap.beforeName}\" su {gap.beforeTrack}.",
        "ja_JP": "「{gap.beforeName}」（{gap.beforeTrack}）の後に{labels.duration}の黒いビデオがあります（{gap.startTimecode}～{gap.endTimecode}）。",
        "ko_KR": "{labels.duration} 동안 검은 화면({gap.startTimecode}~{gap.endTimecode}): {gap.beforeTrack}의 \"{gap.beforeName}\" 뒤.",
        "pt_BR": "Vídeo preto por {labels.duration} ({gap.startTimecode} a {gap.endTimecode}) depois de \"{gap.beforeName}\" em {gap.beforeTrack}.",
        "ru_RU": "Черный экран в течение {labels.duration} (с {gap.startTimecode} по {gap.endTimecode}) после «{gap.beforeName}» на {gap.beforeTrack}.",
        "zh_CN": "{labels.duration} 黑场视频（{gap.startTimecode} 至 {gap.endTimecode}），位于 {gap.beforeTrack} 上的“{gap.beforeName}” 之后。"
      }
    },
    {
      "condition": {
        "all": [
          {
            "field": "gap.durationFrames",
            "operator": "greaterThanOrEqual",
            "value": {
              "field": "options.minFrames"
            }
          },
          {
            "any": [
              {
                "field": "gap.kind",
                "operator": "equals",
                "value": "inner"
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "leading"
                  },
                  {
                    "field": "options.leading",
                    "operator": "equals",
                    "value": true
                  }
                ]
              },
              {
                "all": [
                  {
                    "field": "gap.kind",
                    "operator": "equals",
                    "value": "trailing"
                  },
                  {
                    "field": "options.trailing",
                    "operator": "equals",
                    "value": true
                  }
                ]
              }
            ]
          },
          {
            "all": [
              {
                "field": "gap.hasBefore",
                "operator": "equals",
                "value": false
              },
              {
                "field": "gap.hasAfter",
                "operator": "equals",
                "value": false
              }
            ]
          }
        ]
      },
      "message": {
        "en_US": "Black video for {labels.duration} ({gap.startTimecode} to {gap.endTimecode}).",
        "de_DE": "Schwarzbild für {labels.duration} ({gap.startTimecode} bis {gap.endTimecode}).",
        "es_ES": "Vídeo en negro durante {labels.duration} (de {gap.startTimecode} a {gap.endTimecode}).",
        "fr_FR": "Vidéo noire pendant {labels.duration} ({gap.startTimecode} à {gap.endTimecode}).",
        "it_IT": "Video nero per {labels.duration} (da {gap.startTimecode} a {gap.endTimecode}).",
        "ja_JP": "{labels.duration}の黒いビデオがあります（{gap.startTimecode}～{gap.endTimecode}）。",
        "ko_KR": "{labels.duration} 동안 검은 화면({gap.startTimecode}~{gap.endTimecode}).",
        "pt_BR": "Vídeo preto por {labels.duration} ({gap.startTimecode} a {gap.endTimecode}).",
        "ru_RU": "Черный экран в течение {labels.duration} (с {gap.startTimecode} по {gap.endTimecode}).",
        "zh_CN": "{labels.duration} 黑场视频（{gap.startTimecode} 至 {gap.endTimecode}）。"
      }
    }
  ],
  "labels": {
    "duration": {
      "field": "gap.durationIsSeconds",
      "values": {
        "true": {
          "en_US": "{gap.durationSeconds} s",
          "de_DE": "{gap.durationSeconds} s",
          "es_ES": "{gap.durationSeconds} s",
          "fr_FR": "{gap.durationSeconds} s",
          "it_IT": "{gap.durationSeconds} s",
          "ja_JP": "{gap.durationSeconds} s",
          "ko_KR": "{gap.durationSeconds} s",
          "pt_BR": "{gap.durationSeconds} s",
          "ru_RU": "{gap.durationSeconds} с",
          "zh_CN": "{gap.durationSeconds} s"
        },
        "false": {
          "en_US": {
            "count": "gap.durationFramesRounded",
            "one": "{gap.durationFramesRounded} frame",
            "other": "{gap.durationFramesRounded} frames"
          },
          "de_DE": {
            "count": "gap.durationFramesRounded",
            "one": "{gap.durationFramesRounded} Frame",
            "other": "{gap.durationFramesRounded} Frames"
          },
          "es_ES": {
            "count": "gap.durationFramesRounded",
            "one": "{gap.durationFramesRounded} fotograma",
            "other": "{gap.durationFramesRounded} fotogramas"
          },
          "fr_FR": {
            "count": "gap.durationFramesRounded",
            "one": "{gap.durationFramesRounded} image",
            "other": "{gap.durationFramesRounded} images"
          },
          "it_IT": {
            "count": "gap.durationFramesRounded",
            "one": "{gap.durationFramesRounded} fotogramma",
            "other": "{gap.durationFramesRounded} fotogrammi"
          },
          "ja_JP": "{gap.durationFramesRounded}フレーム",
          "ko_KR": "{gap.durationFramesRounded}프레임",
          "pt_BR": {
            "count": "gap.durationFramesRounded",
            "one": "{gap.durationFramesRounded} quadro",
            "other": "{gap.durationFramesRounded} quadros"
          },
          "ru_RU": {
            "count": "gap.durationFramesRounded",
            "one": "{gap.durationFramesRounded} кадр",
            "few": "{gap.durationFramesRounded} кадра",
            "many": "{gap.durationFramesRounded} кадров",
            "other": "{gap.durationFramesRounded} кадра"
          },
          "zh_CN": "{gap.durationFramesRounded} 帧"
        }
      }
    }
  },
  "data": {
    "gapStart": "gap.start",
    "gapEnd": "gap.end",
    "gapTicks": "gap.durationTicks",
    "kind": "gap.kind",
    "gapFrames": "gap.durationFrames",
    "minFrames": "options.minFrames"
  }
}
```
