FFmpeg 移除视频内嵌字幕

前言
最近打算制作一些视频,所以有了对无字幕版本资源的需求。一些资源网站倒是也有提供 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 的基本命令格式如下:
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.