1. 设置元数据
1.1 设置文件标题
1.2 删除所有流标题
1.3 设置音频流语言
1.4 选项说明
2. 元数据文件-章节
2.1 提取元数据
2.2 编辑元数据文件
2.3 加载元数据文件
2.4 元数据文件说明
2.5 选项说明
3. 设置默认流
3.1 删除第一个音频流的默认属性,设置第二个音频流为默认
3.2 选项说明
1. 设置元数据
1.1 设置文件标题
$ ffmpeg -i Jurassic.World.mkv -map 0 -c copy -metadata title="Jurassic World" out.mkv
$ ffprobe -hide_banner out.mkv
Input #0, matroska,webm, from 'out.mkv':
Metadata:
title : Jurassic World
1.2 删除所有流标题
$ ffmpeg -i Jurassic.World-2015.mkv -map 0 -c copy -metadata:s title="" out.mkv
删除0号流标题
$ ffmpeg -i Jurassic.World-2015.mkv -map 0 -c copy -metadata:s:0 title="" out.mkv
修改前:
$ ffprobe -hide_banner Jurassic.World.mkv
Input #0, matroska,webm, from 'Jurassic.World-2015.mkv':
Metadata:
title : www.------.com
Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709/bt709/unknown, progressive), 1920x960, SAR 1:1 DAR 2:1, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Metadata:
title : ------.com
Stream #0:1(hin): Audio: aac (LC), 48000 Hz, stereo, fltp
Metadata:
title : ------.com
Stream #0:2(eng): Audio: aac (LC), 48000 Hz, stereo, fltp (default)
Metadata:
title : ------.com
1.3 设置音频流语言
$ ffprobe -hide_banner Jurassic.World-2015.mkv
Stream #0:1(hin): Audio: aac (LC), 48000 Hz, stereo, fltp
$ ffmpeg -i Jurassic.World-2015.mkv -map 0 -c copy -metadata:s:a:0 language=eng out.mkv
$ ffprobe -hide_banner out.mkv
Stream #0:1(eng): Audio: aac (LC), 48000 Hz, stereo, fltp
1.4 选项说明
-metadata[:metadata_specifier] key=value (output,per-metadata)
设置元数据键/值对。可以给出可选的metadata_specifier来设置流、章节或节目的元数据。有关-map_metadata 详细信息,请参阅文档。
此选项会覆盖使用-map_metadata. 也可以使用空值删除元数据。
例如,在输出文件中设置标题:
ffmpeg -i in.avi -metadata title="my title" out.flv
设置第一个音频流的语言:
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
-map_chapters input_file_index (output)
将具有索引input_file_index 的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则从包含至少一个章节的第一个输入文件复制章节。使用负文件索引禁用任何章节复制。
-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output)
创建具有指定的节目标题,program_num和指定添加 流(多个)给它。
2. 元数据文件-章节
2.1 提取元数据
分别提取包含及不包含章节的元数据
$ ffmpeg -i IceAge3.mp4 -f ffmetadata fmetadata.txt
2.2 编辑元数据文件
参照编辑元数据文件, 添加章节
[CHAPTER]
TIMEBASE=1/1000
START=190000
# 00:03:10 - 00:06:00 | 170
END=360000
title=Chapter 02a False alarm!
[CHAPTER]
TIMEBASE=1/1000
START=360000
# 00:06:00 - 00:11:00 | 300
END=660000
title=Chapter 03a Playground for Junior
...
2.3 加载元数据文件
$ ffmpeg -i IceAge3.mp4 -i fmetadata.txt -map_metadata 1 -codec copy out.mp4
打开这个新的视频文件, VLC播放器下面多出了前进或后退到章节的按钮. 鼠标移动到进度栏, 就会显示出章节的节点及当前位置的标题名称.
2.4 元数据文件说明
https://ffmpeg.org/ffmpeg-formats.html#Metadata-1
FFmpeg 能够将媒体文件中的元数据转储到一个简单的 UTF-8 编码的类似 INI 的文本文件中,然后使用元数据复用器/解复用器将其加载回来。
文件格式如下:
- 一个文件由一个标题和许多元数据标签组成,这些标签分为多个部分,每个部分占一行。
- 标头是一个‘;FFMETADATA’字符串,后跟一个版本号(现在是 1)。
- 元数据标签的形式为‘key=value’
- 全局元数据紧跟在标头之后
- 在全局元数据之后,可能会有包含每个流/每个章节(per-stream/per-chapter)元数据的部分。
- 一个部分以大写的部分名称(即 STREAM 或 CHAPTER)在方括号(‘[’、‘]’)中开始,并以下一个部分或文件结尾结束。
- 在chapter章节部分的开头,可能有一个可选的时基用于开始/结束值。它必须采用‘TIMEBASE=num/den’形式,其中 num 和 den 是整数。如果缺少时基,则假定开始/结束时间以纳秒为单位。
- 接下来,chapter章节部分必须包含格式为‘START=num’、‘END=num’的章节开始和结束时间,其中 num 是一个正整数。
- 空行和以“;”或“#”开头的行将被忽略。
- 包含特殊字符(‘=’、‘;’、‘#’、‘\’和换行符)的元数据键或值必须用反斜杠‘\’转义。
- 请注意,元数据中的空格被认为是标签的一部分(e.g. ‘foo = bar’)(这里的 key 是 ‘foo ’, value 是 ‘ bar’).
ffmetadata 文件可能如下所示:
;FFMETADATA1
title=bike\\shed
;this is a comment
artist=FFmpeg troll team
[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line
通过使用 ffmetadata muxer 和 demuxer,可以将元数据从输入文件提取到 ffmetadata 文件,然后将文件转码为带有编辑过的 ffmetadata 文件的输出文件。
使用 ffmpeg 提取 ffmetadata 文件如下:
ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE
从 FFMETADATAFILE 文件重新插入编辑过的元数据信息可以通过以下方式完成:
ffmpeg -i INPUT -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT
2.5 选项说明
-map_metadata[: metadata_spec_out ] infile [: metadata_spec_in ] ( output,per-metadata )
从infile设置输出文件的元数据信息。请注意,这些是文件索引(从零开始),而不是文件名。可选的metadata_spec_in/out参数指定要复制的元数据。元数据说明符可以具有以下形式:
g 全局元数据,即适用于整个文件的元数据
s[:stream_spec] 每个流元数据。stream_spec是流说明符,如流说明符章节中所述。在输入元数据说明符中,复制第一个匹配的流。在输出元数据说明符中,所有匹配的流都被复制到。
c:chapter_index 每章元数据。chapter_index是从零开始的章节索引。
p:program_index 每个程序的元数据。program_index是从零开始的节目索引。
如果省略元数据说明符,则默认为全局。
默认情况下,全局元数据从第一个输入文件复制,每个流和每个章节的元数据与流/章节一起复制。通过创建相关类型的任何映射来禁用这些默认映射。负文件索引可用于创建仅禁用自动复制的虚拟映射。
例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据:
ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3
反过来,也就是将全局元数据复制到所有音频流:
ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv
请注意,简单的0在此示例中也能正常工作,因为默认情况下采用全局元数据。
3. 设置默认流
3.1 删除第一个音频流的默认属性,设置第二个音频流为默认
$ ffmpeg -i input.mkv -hide_banner
Stream #0:0: Video: h264 (High), yuv420p(tv, progressive), 1080x454 [SAR 908:909 DAR 240:101], SAR 1:1 DAR 540:227, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(hin): Audio: vorbis, 48000 Hz, 5.1, fltp
(default)
Stream #0:2(eng): Audio: vorbis, 48000 Hz, 5.1, fltp
Stream #0:3(eng): Subtitle: ass (default)
$ ffmpeg -i input.mkv -map 0 -c copy -disposition:a:0 0 -disposition:a:1 default out.mkv
$ ffprobe -hide_banner out.mkv
Stream #0:0: Video: h264 (High), yuv420p(tv, progressive), 1080x454 [SAR 908:909 DAR 240:101], SAR 1:1 DAR 540:227, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(hin): Audio: vorbis, 48000 Hz, 5.1, fltp
Stream #0:2(eng): Audio: vorbis, 48000 Hz, 5.1, fltp
(default)
Stream #0:3(eng): Subtitle: ass (default)
3.2 选项说明
http://www.ffmpeg.org/ffmpeg.html
$ man ffmpeg |grep -A 10 disposition
-disposition[:stream_specifier] value (output,per-stream)
设置流的处置。此选项会覆盖从输入流复制的处置。也可以通过将其设置为 0 来删除处置。
认可以下处置:
default; dub 配音; original 原来的; comment 评论; lyrics 歌词; karaoke 卡拉OK; forced *; hearing_impaired 听力障碍; visual_impaired 视觉障碍; clean_effects 清洁效果; attached_pic 附加图片; captions 字幕; descriptions 说明; dependent 依赖; metadata 元数据.
例如,要使第二个音频流成为默认流:
ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv
要使第二个字幕流成为默认流并从第一个字幕流中删除默认配置:
ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv
要添加嵌入式封面/缩略图:
ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4
并非所有多路复用器都支持嵌入式缩略图,支持的多路复用器仅支持几种格式,例如 JPEG 或 PNG。