FFmpeg 移除视频内嵌字幕

tada-zako

前言

最近打算制作一些视频,所以有了对无字幕版本资源的需求。一些资源网站倒是也有提供 Raws 原版资源,但是大多数还是会有字幕组加工后添加的字幕,于是藉此机会学习了一下如何使用 FFmpeg 移除视频的内嵌字幕。

FFmpeg

简介

FFmpeg 是一个通用媒体转换工具。它可以读取各种输入,包括实时抓取/记录设备,并为媒体流添加过滤器,或将其转码为多种输出格式。

工作原理

ffmpeg 有三大核心功能:

  • libavformat(格式处理):解析多媒体文件(例如 MP4、MKV、AVI),并处理 文件流
  • libavcode(编解码器):解码/编码视频、音频数据。
  • libavfilter(滤镜处理):对视频/音频进行处理,包括视频剪裁、旋转、分辨率或帧率调整等功能。

FFmpeg 处理多媒体文件的过程类似于一条流水线,依次经过多个关键步骤,以完成对音视频数据的解析、处理和重新封装。
当通过 -i 指定输入的媒体文件后,ffmpeg 会调用 解复用器(Demuxer) 读取输入源,提取全局属性(如分辨率、帧率、音频采样率等)和基本输入流(例如视频流、音频流和字幕流等)。通过参数选择保留或丢弃特定的流,可以实现像是删除字幕、音频等功能。
在提取出基本流后, ffmpeg 会根据需要将其传递给 解码器(Decoder) 进行解码,将压缩的音视频数据转换为 原始帧(Raw Frames)。 如果用户选择直接复制流(如 -c copy),则可以跳过解码步骤,直接将数据传递到后续的封装阶段。
如果需要对音视频进行处理,解码后的原始帧会被送入 滤镜图(Filtergraph) 进行进一步的编辑,例如调整音量、裁剪画面、缩放分辨率、添加字幕或进行更复杂的音视频合成操作。
FFmpeg 提供了两种滤镜处理方式:简单滤镜图(Simple Filtergraph) 适用于单个输入和输出流的基本操作,而 复杂滤镜图(Complex Filtergraph) 则用于处理多个输入/输出流。
经过滤镜处理后的音视频数据会被送入 编码器(Encoder) 进行重新压缩。最终,编码后的音视频流会交由 复用器(Muxer) 进行封装,生成最终的输出文件。
ffmpeg流程图

基本用法

ffmpeg 的基本命令格式如下:

1
$ ffmpeg [全局选项] -i [输入文件] [输入选项] [输出选项] [输出文件]
  • 全局选项:

    • -hide_banner 隐藏 ffmpeg 启动时的版权信息和编解码器列表
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      $ ffmpeg -i .\test.mp4
      ffmpeg version 7.1-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
      built with gcc 14.2.0 (Rev1, Built by MSYS2 project)
      configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads ... --enable-chromaprint
      libavutil 59. 39.100 / 59. 39.100
      libavcodec 61. 19.100 / 61. 19.100
      ...
      libswresample 5. 3.100 / 5. 3.100
      libpostproc 58. 3.100 / 58. 3.100
      ...
      # 上述显示的信息是 ffmpeg 的版权信息和编解码器列表
    • -loglevel \[level] 设置日志级别
    • -progress \[url] 以 JSON 格式输出进度信息
  • 输入选项:

  • -t \[N] 只处理前 N 秒

  • -ss \[hh:mm:ss] 从指定的时间开始处理

  • 输出选项

  • 流选择 (-map):ffmpeg 中通过索引 (index) 指定某个流,并且索引从0开始
    -map 0 选择第一个输入文件的所有流
    -map 0:v 选择第一个输入文件的视频流
    -map 1:a 选择第二个输入文件的音频流
    -map -1:s:1 不选择(删除)第二个输入文件的字幕流中的第二个流
    注意: 这里删除流需要在数字前添加 「-」号

  • 编解码选项
    -c:v [指定视频编码器] 例如 libx264、vp
    -c:a [指定音频编码器] 例如 aac、mp3
    -c copy 复制流,不进行编码操作
    -b:v [比特率] 设置视频比特率 例如 -b:v 2500k
    -r [视频帧率] 设置视频帧率 例如 -r 30
    -vf [视频滤镜] 应用视频滤镜 例如 “scale=1280:720”
    -af [音频滤镜] 应用音频滤镜 例如 “volume=1.5”

ffmpeg 去除内封字幕

在考虑删除视频中的字幕时,首先需要确定视频文件中封装的是 软字幕。在资源网站想要获得无字幕的视频时,需要特别留意 [Raws]、[内封字幕] 等标签。其中带有 [Raws] 标签的资源,通常源自官方发布的蓝光 BD 版本这类原始资源。而带有 [内封字幕] 标签的资源才是能够通过 ffmpeg 实现去除字幕操作的素材。

注意:不是内嵌字幕,内嵌字幕无法通过常规方式删除。

如果资源没有标注上述标签,那就只能先将视频下载下来再做进一步查看。在此推荐使用 POTplayer 这款播放器。具体操作如下:在播放器中右键点击视频画面,选择 “字幕”>“关闭显示字幕” 选项。若执行此操作后字幕能够成功关闭,这就表明该视频的字幕流可被删除。
接下来打开命令行终端,首先,在命令行中输入ffmpeg -i input.mp4指令,此操作可查看视频包含的所有流。确认无误后,执行ffmpeg -i input.mp4 -map 0 -map -0:s -c copy output.mp4就可以删除该视频的内封字幕了。操作完成后,生成的 “output.mp4” 即为去除字幕的视频文件。

  • Title: FFmpeg 移除视频内嵌字幕
  • Author: tada-zako
  • Created at : 2025-02-28 20:12:05
  • Updated at : 2025-03-30 11:11:30
  • Link: https://tada-zako.top/2025/技术/remove-embedded-subtitles-using-FFmpeg/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
FFmpeg 移除视频内嵌字幕