Embed Subtitles Burn SRT subtitles into video files using FFmpeg. Prerequisites No SRT file? Use the skill first to generate subtitles from audio/video. Need translation? After transcribing, read the SRT, translate each entry preserving timestamps, write new SRT file. No API needed. Quick Start Options | Option | Short | Default | Description | |--------|-------|---------|-------------| | | | (required) | Input video file | | | | (required) | SRT subtitle file | | | | (required) | Output video file | | | | 20 | Font size in pixels | | | | Arial | Font family name | | | | bottom | Subtitle pos…

, stripped) and not re.match(r'\\d{2}:\\d{2}:\\d{2}', stripped):\n line = '\\u202B' + line + '\\u202C'\n result.append(line)\n\nwith open('SRT_FILE_PATH', 'w', encoding='utf-8') as f:\n f.write('\\n'.join(result))\n\"\n```\n\n- **U+202B** (RLE - Right-to-Left Embedding): forces RTL paragraph direction\n- **U+202C** (PDF - Pop Directional Formatting): closes the embedding\n\n**This fixes:** English words at line start, periods/commas on wrong side, mixed bidi text.\n\n### When to apply\n\nClaude should analyze the SRT content intelligently:\n- If most text is Hebrew/Arabic/Farsi → apply RTL fix\n- If mixed but predominantly RTL → apply RTL fix\n- If LTR (English, Spanish, etc.) → skip\n- No flag needed from the user - detect automatically\n\n## Notes\n\n- For Arabic credits, use English text due to FFmpeg drawtext RTL limitations\n- Use `--extract-frame` to verify subtitle positioning before final render\n---","attachment_filenames":[],"attachments":[],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Embed Subtitles","type":"text"}]},{"type":"paragraph","content":[{"text":"Burn SRT subtitles into video files using FFmpeg.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Prerequisites","type":"text"}]},{"type":"paragraph","content":[{"text":"No SRT file?","type":"text","marks":[{"type":"strong"}]},{"text":" Use the ","type":"text"},{"text":"transcribe","type":"text","marks":[{"type":"code_inline"}]},{"text":" skill first to generate subtitles from audio/video.","type":"text"}]},{"type":"paragraph","content":[{"text":"Need translation?","type":"text","marks":[{"type":"strong"}]},{"text":" After transcribing, read the SRT, translate each entry preserving timestamps, write new SRT file. No API needed.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Start","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cd ~/.claude/skills/embed-subtitles/scripts\n\n# Burn SRT into video\nnpx ts-node embed-subtitles.ts -i video.mp4 -s subtitles.srt -o output.mp4\n\n# Custom styling\nnpx ts-node embed-subtitles.ts -i video.mp4 -s subtitles.srt -o output.mp4 \\\n --font-size 24 --position bottom --margin 40\n\n# Add credit text overlay at end\nnpx ts-node embed-subtitles.ts -i video.mp4 -s subtitles.srt -o output.mp4 \\\n --credit \"Your Name\" --credit-position top","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Options","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Option","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Short","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Default","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--input","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-i","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(required)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Input video file","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--subtitles","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-s","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(required)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SRT subtitle file","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--output","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-o","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"(required)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Output video file","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--font-size","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Font size in pixels","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--font-name","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Arial","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Font family name","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--position","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"bottom","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Subtitle position: top, center, bottom","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--margin","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"25","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Margin from edge in pixels","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--color","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"white","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Text color","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--outline","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Outline thickness","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--shadow","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Shadow depth","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--credit","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Credit text to show at end","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--credit-position","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"top","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Credit position: top, bottom","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--credit-duration","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2.5","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Credit display duration in seconds","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--extract-frame","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Extract frame at specified second for verification","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Position Values","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"top","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Near top of video (good for credits, avoids bottom burned-in text)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"center","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Middle of video","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"bottom","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Near bottom of video (traditional subtitle position)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Dependencies","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"FFmpeg (must be installed and in PATH)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"RTL Auto-Detection & Fix (CRITICAL)","type":"text"}]},{"type":"paragraph","content":[{"text":"Before embedding ANY SRT file, Claude MUST check if the content is RTL.","type":"text","marks":[{"type":"strong"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Detection","type":"text"}]},{"type":"paragraph","content":[{"text":"Read the SRT file and check if the majority of text lines contain Hebrew/Arabic/Farsi characters:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hebrew range: ","type":"text"},{"text":"\\u0590-\\u05FF","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Arabic range: ","type":"text"},{"text":"\\u0600-\\u06FF","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Farsi additional: ","type":"text"},{"text":"\\u0750-\\u077F","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"If RTL content is detected, apply the fix BEFORE passing to FFmpeg.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"RTL Fix","type":"text"}]},{"type":"paragraph","content":[{"text":"Wrap each text line (not index numbers, not timestamps) with Unicode directional marks:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"python3 -c \"\nimport re\n\nwith open('SRT_FILE_PATH', 'r', encoding='utf-8') as f:\n content = f.read()\n\nlines = content.split('\\n')\nresult = []\nfor line in lines:\n stripped = line.strip()\n if stripped and not re.match(r'^\\d+

Embed Subtitles Burn SRT subtitles into video files using FFmpeg. Prerequisites No SRT file? Use the skill first to generate subtitles from audio/video. Need translation? After transcribing, read the SRT, translate each entry preserving timestamps, write new SRT file. No API needed. Quick Start Options | Option | Short | Default | Description | |--------|-------|---------|-------------| | | | (required) | Input video file | | | | (required) | SRT subtitle file | | | | (required) | Output video file | | | | 20 | Font size in pixels | | | | Arial | Font family name | | | | bottom | Subtitle pos…

, stripped) and not re.match(r'\\d{2}:\\d{2}:\\d{2}', stripped):\n line = '\\u202B' + line + '\\u202C'\n result.append(line)\n\nwith open('SRT_FILE_PATH', 'w', encoding='utf-8') as f:\n f.write('\\n'.join(result))\n\"","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"U+202B","type":"text","marks":[{"type":"strong"}]},{"text":" (RLE - Right-to-Left Embedding): forces RTL paragraph direction","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"U+202C","type":"text","marks":[{"type":"strong"}]},{"text":" (PDF - Pop Directional Formatting): closes the embedding","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"This fixes:","type":"text","marks":[{"type":"strong"}]},{"text":" English words at line start, periods/commas on wrong side, mixed bidi text.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"When to apply","type":"text"}]},{"type":"paragraph","content":[{"text":"Claude should analyze the SRT content intelligently:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If most text is Hebrew/Arabic/Farsi → apply RTL fix","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If mixed but predominantly RTL → apply RTL fix","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If LTR (English, Spanish, etc.) → skip","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No flag needed from the user - detect automatically","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Notes","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For Arabic credits, use English text due to FFmpeg drawtext RTL limitations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"--extract-frame","type":"text","marks":[{"type":"code_inline"}]},{"text":" to verify subtitle positioning before final render","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"embed-subtitles","author":"@skillopedia","source":{"stars":39,"repo_name":"claude-skills-library","origin_url":"https://github.com/aviz85/claude-skills-library/blob/HEAD/skills/embed-subtitles/SKILL.md","repo_owner":"aviz85","body_sha256":"613081f7bde2858298fd7292df168afb581c2d1de70ff3943b686705f312369d","cluster_key":"461c2537677c99d3f9adbd95b9b52a8bd3959c4095418fbc5b1f1387fb53eaff","clean_bundle":{"format":"clean-skill-bundle-v1","source":"aviz85/claude-skills-library/skills/embed-subtitles/SKILL.md","bundle_sha256":"d4f41282d8481bd7309fc7cbbef6efbd84916da96af7ff5ac4ac0c86acab4cfb","attachment_count":0,"text_attachments":0,"binary_attachments":0},"cluster_size":2,"skill_md_path":"skills/embed-subtitles/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"media-content","category_label":"Media"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"media-content","import_tag":"clean-skills-v1","description":"Burn subtitles onto videos using FFmpeg. Use for: hardcode subtitles, embed captions, video subtitling."}},"renderedAt":1782980573395}

Embed Subtitles Burn SRT subtitles into video files using FFmpeg. Prerequisites No SRT file? Use the skill first to generate subtitles from audio/video. Need translation? After transcribing, read the SRT, translate each entry preserving timestamps, write new SRT file. No API needed. Quick Start Options | Option | Short | Default | Description | |--------|-------|---------|-------------| | | | (required) | Input video file | | | | (required) | SRT subtitle file | | | | (required) | Output video file | | | | 20 | Font size in pixels | | | | Arial | Font family name | | | | bottom | Subtitle pos…