Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 如何在ffmpeg中禁用字幕解码_Video_Stream_Ffmpeg_Video Encoding_Subtitle - Fatal编程技术网

Video 如何在ffmpeg中禁用字幕解码

Video 如何在ffmpeg中禁用字幕解码,video,stream,ffmpeg,video-encoding,subtitle,Video,Stream,Ffmpeg,Video Encoding,Subtitle,我正在尝试使用FFMpeg将一些包含视频、音频和字幕流的视频文件转换为另一种格式。然而,ffmpeg抱怨字幕格式——它无法解码流。由于我不需要这个字幕流,我想知道如何在转换期间禁用字幕流解码?我终于找到了答案 有这样一个选项,如-sn,它禁止从输入流中解码字幕。还有类似的音频和视频解码选项:-an和-vn 事实证明,还有另一种方法可以实现这一点。可以使用-map选项选择要解码的流。因此,省略-map选项中的字幕流就可以了 例如,如果有一个包含3个流的电影文件: 流0:视频 流1:音频 流2:字

我正在尝试使用FFMpeg将一些包含视频、音频和字幕流的视频文件转换为另一种格式。然而,ffmpeg抱怨字幕格式——它无法解码流。由于我不需要这个字幕流,我想知道如何在转换期间禁用字幕流解码?

我终于找到了答案

有这样一个选项,如
-sn
,它禁止从输入流中解码字幕。还有类似的音频和视频解码选项:
-an
-vn

事实证明,还有另一种方法可以实现这一点。可以使用
-map
选项选择要解码的流。因此,省略
-map
选项中的字幕流就可以了

例如,如果有一个包含3个流的电影文件:

  • 流0:视频
  • 流1:音频
  • 流2:字幕
FFmpeg的转换命令可能如下所示:

ffmpeg -i <input file> -sn -vcodec <video codec> -acodec <audio codec>  <output file>
ffmpeg-i-sn-vcodec-acodec

ffmpeg-i-vcodec-acodec-map 0:0-map 0:1

前一个命令行取消选择字幕流(如果有多个,则可能全部取消选择),而后一个命令行仅选择需要解码的流。

要删除字幕流而不重新编码视频和音频,最短的命令是:

ffmpeg-i input.mkv-sn-c copy output.mkv

使用负映射忽略字幕并保留所有其他内容:

ffmpeg -i input.mkv -map 0 -map -0:s -c copy output.mkv
  • -map 0
    选择所有流。建议这样做,因为默认行为仅为每个流类型选择1个流
  • -map-0:s
    是一个负映射,它取消选择所有字幕流
  • -c copy
    启用仅重新多路复用并避免重新编码的模式

+1第一种方法(-sn选项)完全有效,谢谢。(在mkv文件上试用过)效果很好!如果您只需要从视频文件中删除subs而不重新编码它,那么它的工作速度非常快:
ffmpeg-i video.mkv-vcodec copy-acodec copy-sn video no subs.mkv
删除字幕也有助于避免多路复用。尽管VLC将一些元数据显示为字幕,但要使用ffmpeg删除这些元数据,您需要
-map\u metadata-1
ffmpeg -i input.mkv -map 0 -map -0:s -c copy output.mkv