1. ffmpeg简介 2. 摘录文档 2.1 过滤 Filtering 2.1.1 简单滤镜 2.1.2 复杂的滤镜 2.1.3 简单过滤与复杂过滤 2.2 Stream 流复制 2.3 对比图 3. 提取字幕 4. 如何将字幕刻录到视频中 5. 如何将其他FFmpeg支持的字幕转换为ASS格式 6. 如何将YouTube SBV转换为SRT 7. 获取可用信息 8. 从VOB提取字幕到SRT的工具
1. ffmpeg简介
http://www.ffmpeg.org/
完整的跨平台解决方案,用于记录,转换和流传输音频和视频。开放源代码:
$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
https://github.com/FFmpeg/FFmpeg
http://www.ffmpeg.org/about.html
- 功能完整: FFmpeg是领先的多媒体框架,能够解码(decode),编码(encode),转码(transcode),复用(mux),解复用(demux),流(stream),过滤(filter)和播放(play)人类和机器创建的几乎所有内容。
- 几乎只是所有格式: FFmpeg支持最模糊的古代格式,直至最前沿。无论它们是由某些标准委员会,社区还是公司设计的。
- 跨平台高度可移植性: FFmpeg可以在各种构建环境,机器体系结构和配置下,跨Linux,Mac OS X,Microsoft Windows,BSD,Solaris等编译,运行并通过我们的测试基础架构 FATE。
- 每日更新的文档: 各种在线每晚更新一次,并且对应于最新的FFmpeg版本。http://www.ffmpeg.org/documentation.html
术语:
- 容器(Container) 容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
- 流(Stream) 是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
- 帧(Frame) 帧代表一幅静止的图像,分为I帧,P帧,B帧。
FFmpeg工具
- ffmpeg: 是可转换音频或视频格式的命令行工具。它还可以从各种硬件和软件源(例如电视捕获卡)实时捕获和编码。
- ffplay: 一个基于SDL和FFmpeg库的简单媒体播放器
- ffprobe: 一个简单的多媒体流分析仪。用于显示媒体信息(文本,CSV,XML,JSON)的命令行工具,另请参见Mediainfo。
FFmpeg开发人员库
- libavutil: 是一个包含简化程序功能的库,其中包括随机数生成器,数据结构,数学例程,核心多媒体实用程序等。
- libavcodec: 是一个库,其中包含音频/视频编解码器的解码器和编码器。
- libavformat: 是一个包含用于多媒体容器格式的解复用器和复用器的库。
- libavdevice: 是一个包含输入和输出设备的库,用于从许多常见的多媒体输入/输出软件框架(包括Video4Linux,Video4Linux2,VfW和ALSA)中获取和呈现。
- libavfilter: 是一个包含媒体过滤器的库。
- libswscale: 是一个执行高度优化的图像缩放和颜色空间/像素格式转换操作的库。
- libswresample: 是一个执行高度优化的音频重采样,重矩阵化和样本格式转换操作的库。
2. 摘录文档
http://www.ffmpeg.org/ffmpeg.html
ffmpeg下图描述了每个输出的转码过程: 2.3 对比图
- Demuxer 解复用器(file → packets): ffmpeg调用libavformat库(包含解复用器)读取[输入文件]并从中获取[包含编码数据的数据包]。
- Decoder 解码器(packets → frames): 产生[未压缩的帧](原始视频/PCM音频/...)。可以通过 过滤 进一步处理。
- Encoder 编码器(frames → packets): 对其进行编码并输出[编码后的数据包]。
- Muxer 复用器(packets → file): 将[编码的数据包]写入[输出文件]。
2.1 过滤 Filtering
编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。几个链接的过滤器形成一个过滤器图。
ffmpeg区分两种类型的过滤器图:简单过滤器和复杂过滤器。
2.1.1 简单滤镜
简单的过滤器图是那些只有一个输入和输出,并且都是相同类型的过滤器。
在输出的转码过程图中,可以通过在解码和编码之间简单插入一个附加步骤来表示它们: 2.3 对比图
使用每个流配置简单的过滤器图 -filter 选项(与 -vf 和 -af分别为视频和音频的别名)。见: 2.1.3 简单过滤与复杂过滤
请注意,某些过滤器会更改框架属性,但不会更改框架内容。例如,fps上面示例中的 过滤器更改了帧数,但没有触及帧内容。另一个示例是setpts过滤器,该过滤器仅设置时间戳,否则不传递帧。
2.1.2 复杂的滤镜
复杂的过滤器图不能简单地描述为应用于一个流的线性处理链。例如,当图形具有多个输入和/或输出时,或者输出流类型与输入不同时,就是这种情况。见: 3.1.3 简单过滤与复杂过滤
复杂的滤镜配置为 -filter_complex选项。请注意,此选项是全局选项,因为复杂的滤镜本质上不能与单个流或文件明确关联。
-lavfi 选项等效于 -filter_complex.
复杂overlay过滤器图的一个简单例子是过滤器,它具有两个视频输入和一个视频输出,其中一个视频叠加在另一个视频之上。它的音频副本是amix过滤器。
2.1.3 简单过滤与复杂过滤
input | Simple filtergraph | output | |
File | deinterlace 逐行扫描 → |
scale 比例 → |
File |
File1 File2 File3 |
complex filter graph → |
File1 File2 |
2.2 Stream 流复制
流复制是通过将copy参数提供给 -编解码器选项。它ffmpeg忽略了指定流的解码和编码步骤,因此仅进行解复用和复用。这对于更改容器格式或修改容器级别的元数据很有用。
由于没有解码或编码,因此速度非常快,并且没有质量损失。但是,由于许多因素,在某些情况下它可能不起作用。显然,应用过滤器也是不可能的,因为过滤器可以处理未压缩的数据。
2.3 对比图:
3. 提取字幕
官方FFmpeg Wiki: https://trac.ffmpeg.org/wiki
杂项 Miscellaneous 常规命令行用法
如何提取视频文件中包含的字幕。
https://trac.ffmpeg.org/wiki/ExtractSubtitles
FFmpeg可以从嵌入式字幕轨道中“读取”或“extract提取”字幕。例如,如果您运行:'ffmpeg -i <my_file>' 可以看到类似如下:
$ ffmpeg -i See.S01E06.mkv
Stream #0:0(eng): Video: h264 (High),...1392x660, 23.98 fps, ...
Stream #0:1(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 384 kb/s (default)
Stream #0:2(eng): Subtitle: subrip
Stream #0:3(eng): Subtitle: subrip
...
Stream #0:7(chi): Subtitle: subrip
title : Chinese (Simplified)
Stream #0:8(chi): Subtitle: subripzmgc
title : Chinese (Traditional)
可以提取或转换这些字幕。转换为srt。
$ ffmpeg -i See.S01E06.mkv sub2.srt
如果您的视频文件中有多个字幕轨道,则默认情况下它将选择第一个。您可以使用[map]命令选择所需的对象。
$ ffmpeg -i See.S01E06.mkv sub2.srt
Stream #0:0(eng): Subtitle: subrip (srt)
Stream #0:2 -> #0:0 (subrip (srt) -> subrip (srt))
$ ffmpeg -i See.S01E06.mkv -map 0:s:0 sub1.srt //英文
Stream #0:0(eng): Subtitle: subrip (srt)
Stream #0:2 -> #0:0 (subrip (srt) -> subrip (srt))
$ ffmpeg -i See.S01E06.mkv -map 0:s:5 sub5.srt //简体
Stream #0:0(chi): Subtitle: subrip (srt)
Stream #0:7 -> #0:0 (subrip (srt) -> subrip (srt))
$ ffmpeg -i See.S01E06.mkv -map 0:s:6 sub6.srt //繁体
Stream #0:0(chi): Subtitle: subrip (srt)
Stream #0:8 -> #0:0 (subrip (srt) -> subrip (srt))
$ ffmpeg -i See.S01E06.mkv -map 0:s:7 sub7.srt //捷克
Stream #0:0(cze): Subtitle: subrip (srt)
Stream #0:9 -> #0:0 (subrip (srt) -> subrip (srt))
您还可以转换为.ssa格式,等等。这是列出所有可用字幕选项的方法:
$ ffmpeg -codecs |grep subtitle
...
DES... ass ASS (Advanced SSA) subtitle (decoders: ssa ass ) (encoders: ssa ass )
DES... dvb_subtitle DVB subtitles (decoders: dvbsub ) (encoders: dvbsub )
DES... dvd_subtitle DVD subtitles (decoders: dvdsub ) (encoders: dvdsub )
D.S... hdmv_pgs_subtitle HDMV Presentation Graphic Stream subtitles (decoders: pgssub )
..S... hdmv_text_subtitle HDMV Text subtitle
D.S... jacosub JACOsub subtitle
D.S... microdvd MicroDVD subtitle
D.S... mpl2 MPL2 subtitle
D.S... pjs PJS (Phoenix Japanimation Society) subtitle
D.S... realtext RealText subtitle
D.S... sami SAMI subtitle
..S... srt SubRip subtitle with embedded timing
..S... ssa SSA (SubStation Alpha) subtitle
D.S... stl Spruce subtitle format
DES... subrip SubRip subtitle (decoders: srt subrip ) (encoders: srt subrip )
D.S... subviewer SubViewer subtitle
D.S... subviewer1 SubViewer v1 subtitle
D.S... vplayer VPlayer subtitle
DES... webvtt WebVTT subtitle
您的FFmpeg需要配置--enable-libzvbi才能起作用,并导致如下所示:
Stream #0:17 -> #3:0 (dvb_teletext (libzvbi_teletextdec) -> subrip (srt))
vbi图文电视是一种格式规范,允许在广播的视频帧之间包括文本(字符)和一些基本图像作为元数据。
libzvbi_teletextdec可以对其进行解码,并以两种格式输出,即“图像”输出或“文本”输出。默认为图像。必须选择文本输出才能将其转换为其他文本格式,例如srt。见这里查看更多选项。https://www.ffmpeg.org/ffmpeg-all.html#libzvbi_002dteletext
4. 如何将字幕刻录到视频中
https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo
subtitles filter
如果字幕是名为subtitle.srt的单独文件
$ ffmpeg -i video.avi -vf subtitles=subtitle.srt out.avi
如果字幕嵌入在容器video.mkv中
$ ffmpeg -i video.mkv -vf subtitles=video.mkv out.avi
ass filter
$ ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi
如果字幕位于SubRip,MicroDVD或任何其他受支持的文本字幕中,则必须在使用此过滤器之前将其转换为ASS:
$ ffmpeg -i subtitle.srt subtitle.ass
Picture-based subtitles 基于图片的字幕
你可以燃烧“基于图像的”字幕到一部电影中,通过使用叠加视频滤波器以覆盖图像。例如,dvdsub是一种基于图片的叠加字幕。在单独的流中带有dvdsub字幕的MKV的示例:
$ ffmpeg -i input.mkv -filter_complex "[0:v][0:s]overlay[v]" -map "[v]" -map 0:a <output options> output.mkv
如果您有多个字幕流,则可以通过将[0:s]替换为[0:s:0]来选择第一个字幕流,或用[0:s:1]来选择第二个字幕流,从而选择要使用的字幕流,等等。
$ ffmpeg -i input.ts -filter_complex "[0:v][0:s]overlay[v]" -map "[v]" -map 0:a:0 <output options> output.mkv
另请参见官方文档http://ffmpeg.org/ffmpeg.html;搜索硬编码"hardcode"。
作为特殊的例外,您可以使用位图字幕流作为输入:它将转换为与文件中最大视频大小相同的视频,如果没有视频,则为720x576。请注意,这是一个实验性的临时解决方案。一旦libavfilter正确支持字幕,它将被删除。
例如,要将字幕硬编码在以MPEG-TS格式存储的DVB-T记录的顶部,可将字幕延迟1秒:
$ ffmpeg -i input.ts -filter_complex \
'[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
-sn -map '#0x2dc' output.mkv
(0x2d0, 0x2dc and 0x2ef分别是视频,音频和字幕流的MPEG-TS PID; 0:0, 0:3 and 0:7 也会起作用)
http://ffmpeg.org/ffmpeg-filters.html#subtitles-1
11.195字幕
使用libass库在输入视频的顶部绘制字幕。
要启用此过滤器的编译功能,您需要使用配置FFmpeg --enable-libass。
该过滤器还需要使用libavcodec和libavformat构建,以将传递的字幕文件转换为ASS(高级变电站Alpha)字幕格式。
例如:
- 渲染文件 sub.srt 在输入视频的顶部,使用:subtitles=sub.srt 等效于:subtitles=filename=sub.srt
- 从文件渲染默认字幕流 video.mkv, 使用:subtitles=video.mkv
- 要渲染该文件的第二个字幕流,使用:subtitles=video.mkv:si=1
- 使字幕流从 sub.srt以80%透明的蓝色显示 DejaVu Serif,使用:subtitles=sub.srt:force_style='FontName=DejaVu Serif,PrimaryColour=&HCCFF0000'
5. 如何将其他FFmpeg支持的字幕转换为ASS格式
https://trac.ffmpeg.org/wiki/HowToConvertSubtitleToASS
Simply like this:
$ ffmpeg -i input.srt output.ass
要列出FFmpeg支持的所有字幕编解码器,您可以输入:
$ ffmpeg -codecs | grep "^...S"
输出应如下所示:
..S... = Subtitle codec
..S... arib_caption ARIB STD-B24 caption
DES... ass ASS (Advanced SSA) subtitle (decoders: ssa ass ) (encoders: ssa ass )
DES... dvb_subtitle DVB subtitles (decoders: dvbsub ) (encoders: dvbsub )
..S... dvb_teletext DVB teletext
DES... dvd_subtitle DVD subtitles (decoders: dvdsub ) (encoders: dvdsub )
D.S... eia_608 EIA-608 closed captions (decoders: cc_dec )
D.S... hdmv_pgs_subtitle HDMV Presentation Graphic Stream subtitles (decoders: pgssub )
..S... hdmv_text_subtitle HDMV Text subtitle
D.S... jacosub JACOsub subtitle
D.S... microdvd MicroDVD subtitle
DES... mov_text MOV text
D.S... mpl2 MPL2 subtitle
D.S... pjs PJS (Phoenix Japanimation Society) subtitle
D.S... realtext RealText subtitle
D.S... sami SAMI subtitle
..S... srt SubRip subtitle with embedded timing
..S... ssa SSA (SubStation Alpha) subtitle
D.S... stl Spruce subtitle format
DES... subrip SubRip subtitle (decoders: srt subrip ) (encoders: srt subrip )
D.S... subviewer SubViewer subtitle
D.S... subviewer1 SubViewer v1 subtitle
DES... text raw UTF-8 text
..S... ttml Timed Text Markup Language
D.S... vplayer VPlayer subtitle
DES... webvtt WebVTT subtitle
DES... xsub XSUB
6. 如何将YouTube SBV转换为SRT
https://trac.ffmpeg.org/wiki/HowToConvertYouTubeSBVtoSRT
$ ffmpeg -i captions.sbv captions.srt
YouTube上仅支持SBV(子视图)和SRT(SubRipText)字幕的基本特征。
值得注意的是,用户可以将现有的隐藏式字幕(包括自动生成的字幕)下载为SBV,将其转换为 MPlayer支持的SRT,在文本编辑器(如 vim或记事本)中编辑字幕(提示:YouTube希望使用UTF-8),并将固定版本上传到YouTube,覆盖给定语言的旧字幕。
上面显示的自动生成的SBV示例(从YouTube电影预告片下载)实际上使用了重叠的时间戳记,FFmpeg在SRT转换中将其保留为原样。对于理论看WebM项目 总WebVTT插入注释,在实践中输入选项-fix_sub_duration可以摆脱这个:
$ ffmpeg -fix_sub_duration -i captions.sbv captions.srt
区别 | .sbv (Youtube) | .srt (最简单,最常用的外挂字幕) |
有无序号 | 无计数器 | 有计数器 |
时间格式 | h:mm:ss.nnn | hh:mm:ss,nnn |
时间区间 | 开始,结束 | 开始 --> 结束 |
时间例子: | h:mm:ss.nnn,h:mm:ss.nnn | hh:mm:ss,nnn --> hh:mm:ss,nnn |
完整的例子 | 0:00:01.400,0:00:06.770 you know where's the girl who hasn't 0:00:04.610,0:00:08.840 gotten to college or even maybe finished |
1 00:00:05,000 --> 00:00:10,100 you know where's the girl who hasn't 2 00:00:10,100 --> 00:00:13,700 gotten to college or even maybe finished |
7. 获取可用信息
最后一列斜体数字,是"|wc -l"选项统计的行数,不同的系统环境及软件版本会有不同,仅供参考。
-h | -- print basic options | -打印基本选项 | 110 |
-h long | -- print more options | -打印更多选项 | 222 |
-h full | all options (including all format and codec specific options, very long) | 11352 | |
-h type=name | all options for the named decoder/encoder/demuxer/muxer/filter/bsf | ||
-L | show license | 演出许可证 | |
-version | show version | 显示版本 | |
-buildconf | show build configuration | 显示构建配置 | 47 |
-formats | show available formats | 显示可用格式 | 361 |
-muxers | show available muxers 复用器(mux) | 把不同的流按照某种容器的规则放入容器 | 172 |
-demuxers | show available demuxers 解复用(demux) | 把不同的流从某种容器中解析出来 | 311 |
-codecs | show available codecs 编解码器(Codec) | 是对视频进行压缩或者解压缩 | 463 |
-decoders | show available decoders 解码器 | 477 | |
-encoders | show available encoders 编码器 | 199 | |
-bsfs | show available bit stream filters | 显示可用的比特流过滤器 | 35 |
-protocols | show available protocols | 显示可用的协议 | 64 |
-filters | show available filters | 显示可用的过滤器 | 395 |
-pix_fmts | show available pixel formats | 显示可用的像素格式 | 201 |
-layouts | show standard channel layouts | 显示标准频道布局 | 58 |
-sample_fmts | show available audio sample formats | 显示可用的音频样本格式 | 13 |
-colors | show available color names | 显示可用的颜色名称 | 141 |
-devices | show available devices | 显示可用设备 | 16 |
-sources device | list sources of the input device | 列出输入设备的来源 | |
-sinks device | list sinks of the output device | 列出输出设备的接收器 | |
-hwaccels | show available HW acceleration methods | 显示可用的硬件加速方法 |
8. 从VOB提取字幕到SRT的工具
https://classroom.synonym.com/extracting-subtitles-vob-srt-16812.html
SRT文件是一个独立文件,其中包含电影的字幕;许多媒体播放器应用程序可以在播放电影时使用该文件显示字幕。
在DVD电影光盘上,所有视频内容都以VOB格式包含在一组文件中。
几个软件应用程序可让您从一个或多个VOB文件中提取字幕信息并创建SRT文件。
SubRip
该免费软件(请参阅参考资料)可用于硬盘驱动器上已经存在的VOB文件。选择一个或多个VOB文件后,即可开始字幕提取。
它使用光学字符识别进行工作,并在屏幕上显示字符供您检查和确认。
您必须执行此操作,直到确认该软件无法识别的每个字母,数字和符号为止,但是一旦您浏览了该列表,其余字幕就可以更快地提取出来。
提取完成后,只需单击一个按钮即可将结果另存为SRT文件。
Avidemux
这个免费软件(请参阅参考资料)可以直接从DVD驱动器使用VOB文件。
您需要选择光盘上最大的VOB文件,然后选择光盘上另一个ISO格式且包含详细信息(例如字幕的默认语言)的文件。
Avidemux实际上在初始字幕提取过程中分别创建了两个文件,分别为SUB和IDX格式。
要完成此过程,请单击“工具”,选择“ OCR(VobSub-> Srt)”,然后在标题“ VobSub”下选择“打开”。
从这里,您必须选择IDX格式文件。然后,软件将其与SUB格式文件结合起来以创建完成的SRT文件。
DVD SubEdit
DVD SubEdit(参见参考资料)也是免费的,并且与SubRip和Avidemux的工作方式类似,您可以导入VOB文件并以SRT格式导出字幕。
它还包含许多用于更改字幕外观的选项,例如大小,颜色,透明度和位置。
但是,这些更改会影响原始的VOB文件-它们不会影响SRT文件,因为这仅包含字幕的措词而不是外观。
https://en.wikipedia.org/wiki/Closed_captioning
https://en.wikipedia.org/wiki/Subtitles
https://en.wikipedia.org/wiki/Surtitles