14.元数据和字幕
Metadata:元数据 Subtitle:字幕
媒体文件中的元数据部分,包含如艺术家,作者,日期,类型,出版商,标题等额外的信息,这些信息并不会在视频帧中显示。字幕则是文本性的数据,它通常被保存在一个单独的文件(字幕文件)中,且一般会显示在视频帧的底部。当然有一些 container 如 VOB 格式,则支持内嵌一个字幕文件。
元数据介绍
在音乐播放器中,经常用到 MP3 的元数据,我们可以看到 界面上对应MP3 的项上会有名称,艺术家,唱片名等信息。想要显示位于 Windows 默认的音乐目录下 Kalimba.mp3 文件的元数据,我们可以使用命令:
ffplay -i "/Users/Public/Music/Sample Music/Kalimba.mp3"
元数据输出如下所示:
创建元数据
我们可以给媒体文件中添加元数据,通过使用 -metadata 选项,后跟 key = value 的数据对,如果 key 或者 value 中有空格,那么必须使用双引号将它们整体括起来。当我们要添加多个元数据时,应该多次使用 -metadata 选项来完成多次输入,例如:
ffmpeg -i input -metadata artist=FFmpeg -metadata title="Test 1" output
ASF,FLV,Matroska,WMA,WMV 格式的文件支持任意的 key 值。但其他格式仅支持特定的 key 值,其详情如下:
表中的最后一行:user-defined 表示除了列表中列出的 key 值外,还可以使用任意自定义 key 值。例如,我们可以添加如下元数据:
location : London,United kingdom
camera type : SONY DSC
camera mode : movie
weather : sunny
对应的命令如下:
ffmpeg -i video.avi -metadata location="London,United kingdom" -metadata "camera type"="SONY DSC" -metadata "camera mode"="movie" -metadata "weather"="sunny" video.wmv
从文件保存或加载元数据
如果想要将媒体文件中的元数据保存下来,我们可以使用 -f 选项并指定 ffmetadata ,此时的输出就是元数据,我们需要为输出指定文件名保存下来。例如,想要将我们之前生产的 video.vmv 中的元数据保存下来,我们可以使用命令:
ffmpeg -i video.wmv -f ffmetadata data.txt
输出文件 data.txt 中的内容为:
最后一行会包含当前的编码其版本号。
而想要将 data.txt 中的元数据加载到一个媒体文件中,我们仅需要将 data.txt 作为一个输入即可:
ffmpeg -i data.txt -i video1.avi video1.wmv
现在 video1.wmv 和 video.wmv 两个文件中的元数据是完全相同的。我们将 video.wmv 中的元数据保存下来然后再加载到 video1.wmv 中。元数据文件除了从媒体文件中保存下来之外,也可以自动创建,只要符合相关格式即可。元数据文件的第一行是一个固定的头部,用以表明这个文件是个元数据文件,其内容固定为:”;FFMETADATA1“,后面的行就是形如 key=value 的数据对,也就是元数据。
删除元数据
如果想要删除元数据,我们可以使用 -map_metadata 选项并赋值为一个负数,例如想要将输出文件中的元数据全部删除,我们可以使用命令:
ffmpeg -i input.avi -map_metadata -1 output.mp4
字幕介绍
字幕,就是显示在视频底部的文本性数据,它一般用于提供画面之外的额外信息,如为电影台词提供本地翻译,或者以文字的形式来显示台词等。字幕可以分为两种主要类型:
-
外部字幕,以单独的文件形式存在,在媒体播放器其播放视频时,将其加载到视频帧中。其优点是:在没有相关视频的情况下,可以单独编辑和发布。
-
内嵌字幕,其信息和音频流,视频流一样,被保存在文件中
字幕还可以有其他的划分方法,如预备字幕和直播字幕(在视频直播的同时创建的字幕);或者分为 开放字幕和可关闭字幕(open and closed),开发字幕不可以关闭,而可关闭字幕则可以根据需要打开和关闭,常见于 DVD 中。
下表列出了FFmpeg中支持的字幕编解码器以及字幕文件格式。在 Support 一列中,D 表示该 format 可以被解码,E 表示该 format 可以编码( dvb_teletext 和 eia_608 尚未明确对字幕的支持)。例如,想要将 SRT 格式的字幕转化为 ASS 格式,我们可以使用命令:
ffmpeg -i subtitles.srt subtitles.ass
将字幕直接编码到视频
当我们需要编码字幕到视频流中时,有 2 个 filter 可以实现这个功能:ass(仅可以编码 ass 格式字幕)和 subtitles filter。subtitles filter 的描述如下:
为了防止在 Windows 上出现错误信息,我们需要指定字体配置文件的位置,字体配置文件可以从 http://ffmpeg.tv/fonts.conf 下载。请将下载的 fonts.conf 文件保存到 ffmpeg.exe 的目录,并在Windows系统中添加下表的三个环境变量:
请注意:不同的 container 支持不同的字幕格式,大多数 container 都支持 ASS 和 SRT 格式的字幕。例如,想要将 titles.srt 字幕添加到 video.mp4 的视频流中,我们可以使用命令:
ffmpeg -i video.avi -vf subtitles=titles.srt video.mp4