[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XETWDHRK06DD2DHMK82QFR":3,"skill-same:01M6XETWDHRK06DD2DHMK82QFR":66},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":13,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M6XETWDHRK06DD2DHMK82QFR","ffmpeg-video-editing",null,"Video editing with ffmpeg including cutting, trimming, concatenating segments, and re-encoding. Use when working with video files (.mp4, .mkv, .avi) for: removing segments, joining clips, extracting portions, or any video manipulation task.","Waaaalnut\u002Fskillsbench","Waaaalnut","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103995656?v=4","01M6XCS9K1V51EY3JMB7DGMX24","01M6XCS9Q4WPW88W62C55G1H44",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-filler-word-remover\u002Fenvironment\u002Fskills\u002Fffmpeg-video-editing\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"ffmpeg","FFmpeg Video Editing","editing","video editing","Video","mp4","use","files","task","encoding","with","extracting","re","segments","for","trimming","when","2026-11-10 10:12:30",false,"---\nname: ffmpeg-video-editing\ndescription: \"Video editing with ffmpeg including cutting, trimming, concatenating segments, and re-encoding. Use when working with video files (.mp4, .mkv, .avi) for: removing segments, joining clips, extracting portions, or any video manipulation task.\"\n---\n\n# FFmpeg Video Editing\n\n## Cutting Video Segments\n\n### Extract a portion (keep segment)\n\n```bash\n# Extract from start_time to end_time\nffmpeg -i input.mp4 -ss START -to END -c copy output.mp4\n\n# With re-encoding for frame-accurate cuts\nffmpeg -i input.mp4 -ss START -to END -c:v libx264 -c:a aac output.mp4\n```\n\n### Remove a segment (cut out middle)\n\nTo remove a segment, split into parts and concatenate:\n\n```bash\n# 1. Extract before the cut\nffmpeg -i input.mp4 -to CUT_START -c copy part1.mp4\n\n# 2. Extract after the cut  \nffmpeg -i input.mp4 -ss CUT_END -c copy part2.mp4\n\n# 3. Concatenate\nffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4\n```\n\n## Concatenating Multiple Segments\n\n### Using concat demuxer (recommended for same-codec files)\n\nCreate a file list (`segments.txt`):\n```\nfile 'segment1.mp4'\nfile 'segment2.mp4'\nfile 'segment3.mp4'\n```\n\nThen concatenate:\n```bash\nffmpeg -f concat -safe 0 -i segments.txt -c copy output.mp4\n```\n\n### Using filter_complex (for re-encoding)\n\n```bash\nffmpeg -i seg1.mp4 -i seg2.mp4 -i seg3.mp4 \\\n  -filter_complex \"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]\" \\\n  -map \"[v]\" -map \"[a]\" output.mp4\n```\n\n## Removing Multiple Segments (Batch)\n\nFor removing many short segments (like filler words), the efficient approach:\n\n1. Calculate the \"keep\" segments (inverse of remove segments)\n2. Extract each keep segment\n3. Concatenate all keep segments\n\n```python\nimport subprocess\nimport os\n\ndef remove_segments(input_file, segments_to_remove, output_file):\n    \"\"\"\n    segments_to_remove: list of (start, end) tuples in seconds\n    \"\"\"\n    # Get video duration\n    result = subprocess.run([\n        'ffprobe', '-v', 'error', '-show_entries', 'format=duration',\n        '-of', 'default=noprint_wrappers=1:nokey=1', input_file\n    ], capture_output=True, text=True)\n    duration = float(result.stdout.strip())\n\n    # Sort segments and merge overlapping\n    segments = sorted(segments_to_remove)\n\n    # Calculate keep segments (gaps between remove segments)\n    keep_segments = []\n    current_pos = 0.0\n\n    for start, end in segments:\n        if start > current_pos:\n            keep_segments.append((current_pos, start))\n        current_pos = max(current_pos, end)\n\n    if current_pos \u003C duration:\n        keep_segments.append((current_pos, duration))\n\n    # Extract each keep segment\n    temp_files = []\n    for i, (start, end) in enumerate(keep_segments):\n        temp_file = f'\u002Ftmp\u002Fseg_{i:04d}.mp4'\n        subprocess.run([\n            'ffmpeg', '-y', '-i', input_file,\n            '-ss', str(start), '-to', str(end),\n            '-c', 'copy', temp_file\n        ], check=True)\n        temp_files.append(temp_file)\n\n    # Create concat list\n    list_file = '\u002Ftmp\u002Fconcat_list.txt'\n    with open(list_file, 'w') as f:\n        for temp_file in temp_files:\n            f.write(f\"file '{temp_file}'\\n\")\n\n    # Concatenate\n    subprocess.run([\n        'ffmpeg', '-y', '-f', 'concat', '-safe', '0',\n        '-i', list_file, '-c', 'copy', output_file\n    ], check=True)\n\n    # Cleanup\n    for f in temp_files:\n        os.remove(f)\n    os.remove(list_file)\n```\n\n## Common Issues\n\n### Audio\u002FVideo sync problems\n- Use `-c copy` only when cutting at keyframes\n- For precise cuts, re-encode: `-c:v libx264 -c:a aac`\n\n### Gaps or glitches at cut points\n- Ensure segments don't overlap\n- Small buffer (0.01s) between segments can help\n\n### Getting video duration\n\n```bash\nffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4\n```\n","# FFmpeg Video Editing\n\n## Cutting Video Segments\n\n### Extract a portion (keep segment)\n\n```bash\n# Extract from start_time to end_time\nffmpeg -i input.mp4 -ss START -to END -c copy output.mp4\n\n# With re-encoding for frame-accurate cuts\nffmpeg -i input.mp4 -ss START -to END -c:v libx264 -c:a aac output.mp4\n```\n\n### Remove a segment (cut out middle)\n\nTo remove a segment, split into parts and concatenate:\n\n```bash\n# 1. Extract before the cut\nffmpeg -i input.mp4 -to CUT_START -c copy part1.mp4\n\n# 2. Extract after the cut  \nffmpeg -i input.mp4 -ss CUT_END -c copy part2.mp4\n\n# 3. Concatenate\nffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4\n```\n\n## Concatenating Multiple Segments\n\n### Using concat demuxer (recommended for same-codec files)\n\nCreate a file list (`segments.txt`):\n```\nfile 'segment1.mp4'\nfile 'segment2.mp4'\nfile 'segment3.mp4'\n```\n\nThen concatenate:\n```bash\nffmpeg -f concat -safe 0 -i segments.txt -c copy output.mp4\n```\n\n### Using filter_complex (for re-encoding)\n\n```bash\nffmpeg -i seg1.mp4 -i seg2.mp4 -i seg3.mp4 \\\n  -filter_complex \"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]\" \\\n  -map \"[v]\" -map \"[a]\" output.mp4\n```\n\n## Removing Multiple Segments (Batch)\n\nFor removing many short segments (like filler words), the efficient approach:\n\n1. Calculate the \"keep\" segments (inverse of remove segments)\n2. Extract each keep segment\n3. Concatenate all keep segments\n\n```python\nimport subprocess\nimport os\n\ndef remove_segments(input_file, segments_to_remove, output_file):\n    \"\"\"\n    segments_to_remove: list of (start, end) tuples in seconds\n    \"\"\"\n    # Get video duration\n    result = subprocess.run([\n        'ffprobe', '-v', 'error', '-show_entries', 'format=duration',\n        '-of', 'default=noprint_wrappers=1:nokey=1', input_file\n    ], capture_output=True, text=True)\n    duration = float(result.stdout.strip())\n\n    # Sort segments and merge overlapping\n    segments = sorted(segments_to_remove)\n\n    # Calculate keep segments (gaps between remove segments)\n    keep_segments = []\n    current_pos = 0.0\n\n    for start, end in segments:\n        if start > current_pos:\n            keep_segments.append((current_pos, start))\n        current_pos = max(current_pos, end)\n\n    if current_pos \u003C duration:\n        keep_segments.append((current_pos, duration))\n\n    # Extract each keep segment\n    temp_files = []\n    for i, (start, end) in enumerate(keep_segments):\n        temp_file = f'\u002Ftmp\u002Fseg_{i:04d}.mp4'\n        subprocess.run([\n            'ffmpeg', '-y', '-i', input_file,\n            '-ss', str(start), '-to', str(end),\n            '-c', 'copy', temp_file\n        ], check=True)\n        temp_files.append(temp_file)\n\n    # Create concat list\n    list_file = '\u002Ftmp\u002Fconcat_list.txt'\n    with open(list_file, 'w') as f:\n        for temp_file in temp_files:\n            f.write(f\"file '{temp_file}'\\n\")\n\n    # Concatenate\n    subprocess.run([\n        'ffmpeg', '-y', '-f', 'concat', '-safe', '0',\n        '-i', list_file, '-c', 'copy', output_file\n    ], check=True)\n\n    # Cleanup\n    for f in temp_files:\n        os.remove(f)\n    os.remove(list_file)\n```\n\n## Common Issues\n\n### Audio\u002FVideo sync problems\n- Use `-c copy` only when cutting at keyframes\n- For precise cuts, re-encode: `-c:v libx264 -c:a aac`\n\n### Gaps or glitches at cut points\n- Ensure segments don't overlap\n- Small buffer (0.01s) between segments can help\n\n### Getting video duration\n\n```bash\nffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4\n```\n",{"name":5,"description":7},"main","7eeb258ada72b7f58119b0e7a2c00ea89d9beedd","tasks\u002Fvideo-filler-word-remover\u002Fenvironment\u002Fskills\u002Fffmpeg-video-editing","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench","https:\u002F\u002Fgithub.com\u002FWaaaalnut","student of Zhejiang University","2026-04-21 23:16:23",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add Waaaalnut\u002Fskillsbench --skill ffmpeg-video-editing",{"tool":58,"command":59},"bunx","bunx skills add Waaaalnut\u002Fskillsbench --skill ffmpeg-video-editing",{"tool":61,"command":62},"pnpm","pnpm dlx skills add Waaaalnut\u002Fskillsbench --skill ffmpeg-video-editing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-filler-word-remover\u002Fenvironment\u002Fskills\u002Fffmpeg-video-editing\u002FSKILL.md",true,[],[67,81,95,115,137,155],{"skillNo":68,"name":69,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":77,"publishedAt":40},"01M6XEWMJ6VY3ZC53MPDCPG3GH","data-reconciliation","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fxlsx-recover-data\u002Fenvironment\u002Fskills\u002Fdata-reconciliation\u002FSKILL.md",[72],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[78,79,80],"data reconciliation","reconciliation","data",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":40},"01M6XEW8MNPMF1KRXV6ATGFRQF","speech-to-text","Transcribe video to timestamped text using Whisper tiny model (pre-installed).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-tutorial-indexer\u002Fenvironment\u002Fskills\u002Fspeech-to-text\u002FSKILL.md",[],[88,89,90,91,92,93,27,94],"speech","text","speech to text","transcribe video","whisper","model","transcribe",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":102,"publishedAt":40},"01M6XEW3FQZP0T1RKQQJFXVY9T","video-processor","Process videos by removing segments and concatenating remaining parts. Use when you need to remove detected pauses\u002Fopenings from videos, create highlight reels, or batch process segment removals using ffmpeg filter_complex.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fvideo-processor\u002FSKILL.md",[101],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[27,103,104,105,106,107,39,108,36,109,110,111,112,113,23,29,114],"processor","video processor","batch","create","reels","parts","process","videos","you","segment","filter","remove",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":122,"publishedAt":40},"01M6XEVXJ5KZ0NTY3XZKRY4AS1","silence-detector","Detect initial silence segments in audio\u002Fvideo using energy-based analysis. Use when you need to find low-energy periods at the start of recordings (title slides, setup time, pre-roll silence).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsilence-detector\u002FSKILL.md",[121],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[123,124,125,126,39,111,127,128,129,130,131,36,132,133,27,134,135,136,29],"detector","silence detector","title","slides","time","energy","at","recordings","detect","find","Audio","analysis","start","setup",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":40},"01M6XEVT3NGRN1FT7JPMAPXS6M","segment-combiner","Combine multiple segment detection results into a unified list. Use when you need to merge segments from different detectors, prepare removal lists for video processing, or consolidate detection outputs.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsegment-combiner\u002FSKILL.md",[],[112,144,27,145,146,147,148,37,39,149,150,36,111,151,152,29,153,154],"segment combiner","detection","prepare","merge","video processing","outputs","combine","processing","consolidate","results","list",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":164,"publishedAt":40},"01M6XEVMPVASGS2KX86QK4FMT7","report-generator","Generate compression reports for video processing. Use when you need to create structured JSON reports with duration statistics, compression ratios, and segment details after video processing.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Freport-generator\u002FSKILL.md",[161],{"categoryNo":162,"categoryName":163,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000034","行政与办公人员",[165,166,167,112,39,37,111,33,151,168,169,170,29,148,171,27,172,173,106],"generator","report generator","report","statistics","structured","reports","json","compression","generate"]