转换视频时如何添加和/或保留字幕?


16

我有一个要转换为mp4的mkv视频,但是我尝试将其转换为各种方法(手刹,WinFF,ffmpeg,mencoder,...我丢失了视频的字幕。如何转换视频,保留字幕,或添加subtitles.srt?

我还希望2遍编码的视频比特率为4054,音频比特率为160。

谢谢。

我被要求输入ffmpeg -i:

joe@joe-Leopard-Extreme:/media/Elements/Home Folder/Videos$ ffmpeg -i iron.mkv
ffmpeg version 0.8.3-4:0.8.3-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav     developers
built on Jun 12 2012 16:52:09 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
[matroska,webm @ 0x1a319a0] Estimating duration from bitrate, this may be inaccurate
Input #0, matroska,webm, from 'iron.mkv':
Metadata:
title           : Iron 
Duration: 02:06:01.67, start: 0.000000, bitrate: 1280 kb/s
Chapter #0.0: start 0.000000, end 546.170622
Metadata:
  title           : Chapter 00
Chapter #0.1: start 546.170622, end 1080.579489
Metadata:
  title           : Chapter 01
Chapter #0.2: start 1080.579489, end 1609.941667
Metadata:
  title           : Chapter 02
Chapter #0.3: start 1609.941667, end 2101.849733
Metadata:
  title           : Chapter 03
Chapter #0.4: start 2101.849733, end 2595.259333
Metadata:
  title           : Chapter 04
Chapter #0.5: start 2595.259333, end 3158.488667
Metadata:
  title           : Chapter 05
Chapter #0.6: start 3158.488667, end 3564.644400
Metadata:
  title           : Chapter 06
Chapter #0.7: start 3564.644400, end 4052.423356
Metadata:
  title           : Chapter 07
Chapter #0.8: start 4052.423356, end 4304.300000
Metadata:
  title           : Chapter 08
Chapter #0.9: start 4304.300000, end 4711.206489
Metadata:
  title           : Chapter 09
Chapter #0.10: start 4711.206489, end 5080.575489
Metadata:
  title           : Chapter 10
Chapter #0.11: start 5080.575489, end 5700.111067
Metadata:
  title           : Chapter 11
Chapter #0.12: start 5700.111067, end 6269.346400
Metadata:
  title           : Chapter 12
Chapter #0.13: start 6269.346400, end 6811.471333
Metadata:
  title           : Chapter 13
Chapter #0.14: start 6811.471333, end 7561.679000
Metadata:
  title           : Chapter 14
Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, s16, 640 kb/s (default)
Metadata:
  title           : 3/2+1
Stream #0.2(ita): Audio: ac3, 48000 Hz, 5.1, s16, 640 kb/s
Metadata:
  title           : 3/2+1
Stream #0.3(eng): Subtitle: pgssub (default)
Stream #0.4(eng): Subtitle: pgssub
Stream #0.5(eng): Subtitle: pgssub
Stream #0.6(eng): Subtitle: pgssub
At least one output file must be specified
joe@joe-Leopard-Extreme:/media/Elements/Home Folder/Videos

Answers:


19

软订阅

MP4支持流文本格式的字幕,但是在播放器和设备之间对此播放的支持并不普遍。

流复制音频时使用默认流选择行为的基本示例:

ffmpeg -i input.mkv -c copy -c:s mov_text output.mp4

以流方式复制所有视频和音频流,将所有基于文本的字幕输入流(SRT,ASS,VTT等)转换为流文本格式并为前两个字幕流设置语言的示例。

ffmpeg -i input.mkv -map 0 -c copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4

与上述相同,但将视频和音频重新编码为与MP4容器兼容的格式(H.264视频:

ffmpeg -i input.mkv -map 0 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:1 language=ipk output.mp4

与上述相同,但使用该-map选项选择第一视频流,第二音频流和第三字幕流:

ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -map 0:s:2 -c:v libx264 -c:a aac -c:s mov_text -metadata:s:s:0 language=eng output.mp4

硬订阅

基于文本的字幕格式输入

使用字幕过滤器可“老化”基于文本的字幕格式(SRT,ASS,VTT等)。请注意,这需要重新编码,因此比使用软子要慢得多。

流复制音频时使用默认流选择行为的基本示例:

ffmpeg -i input.mkv -filter_complex "subtitles=input.mkv" -c:a copy output.mp4

使用第三视频流,第五字幕流和第一音频流的示例:

ffmpeg -i input.mkv -filter_complex "[0:v:2]subtitles=input.mkv:si=4[v]" -map "[v]" -map 0:a:0 -c:a copy output.mp4

单独的字幕输入文件(your-subtitles-file.srt)的示例:

ffmpeg -i input.mp4 -filter_complex "subtitles=your-subtitles-file.srt" -c:a copy output.mp4

基于图像的字幕格式输入

使用覆盖滤镜。此示例将第四字幕流覆盖在第二视频流上,并复制第七音频流:

ffmpeg -i input.mkv -filter_complex "[0:v:2][0:s:3]overlay[v]" -map "[v]" -map 0:a:6 -c:a copy output.mp4

另见


这让我有些困惑。您可以提供完整的命令吗?是的,我的目标是特定的输出文件大小。
JoeSteiger

@JoeSteiger您应该通过提供ffmpeg -i input.mkvfirst 的控制台输出来更新您的问题。
llogan 2012年

以上是您的意思吗?
JoeSteiger 2012年

@JoeSteiger是的,这很有帮助。
llogan 2012年

K,让我知道下一步该怎么做。
JoeSteiger

13

您可以使用-map 0以确保所有流都已复制。如果格式不可行,则ffmpeg应该会出错。

-map 0告诉ffmpeg / libav包括所有流,而不仅仅是您定义对流规则的流。

通常,-map用于定义流映射-即输入中的流1应该在输出中变为流0。仅使用-map 0,您就可以告诉ffmpeg / libav接受所有流而不进行混洗。


你能解释更多吗?
Kaz Wolfe 2014年

我编辑了答案
Arne Babenhauserheide 2014年

1

如果您只是想简单地转换为mp4,则可以使用VLC。VLC将接受字幕文件并将其呈现到输出中。

对于更复杂的转换(包括字幕样式),可以使用OpenShot。


-1

好吧,我找到了一种使它起作用的方法,虽然不理想,但它可以起作用。我可以使用mkvmerge将srt添加到视频中。唯一的不足是它使视频成为mkv,而不是mp4。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.