使用FFmpeg检索和保存媒体元数据

105
我希望读取媒体文件中的元数据,并将这些元数据保存在文本/XML文件中,以便我以后可以将这些数据插入到我的数据库中。我更喜欢使用ffmpeg。
同时,使用MediaInfo是否也可以实现相同的功能?我知道可以使用MediaInfo获取各个轨道的元数据,但我想自动化它; 也就是说,每当找到新的媒体文件时,读取其元数据,然后将其存储在一个txt/xml文件中。
或者,是否有其他工具/实用程序/API可用于此?

2
如何通过ffmpeg获取节目指南(EPG)? - Dr.jacky
1
似乎没有人知道或目前无法从.ts文件(这是一个扩展名为.eit的文本文件)中导出EPG信息并将其作为元数据放入MP4中。我在互联网上搜索了几个小时,但什么都没找到。我认为这应该是在系列的章节中拥有简短描述的明显且最佳步骤。技术上看起来很容易,但没有工具支持它。 - Joniale
顺便提一下,有一个叫做metaX的软件(http://www.danhinsley.com/),可以从互联网检索元数据,并为.mp4、.mkv等文件设置元数据。你只需要知道系列/电影/节目的名称,它就会寻找数据。不幸的是,它不能处理EPG信息或.ts文件,而且该软件对于系列中的章节效果不佳。如果您能导出EPG数据,则可以解决这个问题。 - Joniale
7个回答

132
您可以使用-f ffmetadata选项将全局元数据保存到文本文件中,方法如下:
ffmpeg -i in.mp4 -f ffmetadata in.txt

如果你还需要从音视频流中获取元数据(例如全局元数据不包含创建时间),请使用以下命令:

ffmpeg -i in.mp4 -c copy -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata in.txt

详情请参见 ffmpeg 文档中的 Metadata 部分。

要从文件中恢复元数据,请参见 https://dev59.com/e2gt5IYBdhLWcg3w7ByL#50580239


10
我发现avprobe打印了更多信息(它与ffmpeg一起出现)。类似"avprobe -show_format input_video -v 0"这样的命令可能会有所帮助。 - matiasg
1
我认为这个页面比链接的那个更加详细:http://www.ffmpeg.org/ffmpeg-formats.html#Metadata - davidkomer
12
如果您的系统中没有avprobe,可能存在于ffprobe - Micah Elliott
1
@DmitryShkuropatsky [mpegts @ 0000000002f6f2a0] PES数据包大小不匹配。输出文件为空,未编码任何内容。-------- 输出内容为:;FFMETADATA1 encoder=Lavf56.40.101 - Dr.jacky
如何通过ffmpeg获取节目指南(EPG)? - Dr.jacky
显示剩余5条评论

65

我更喜欢使用ExifTool,它为我提供的输出比FFmpeg更多。以iPhone文件为例:

exiftool IMG_0014.MOV >a.txt

输出结果为


ExifTool Version Number         : 8.60
File Name                       : IMG_0014.MOV
Directory                       : .
File Size                       : 19 MB
File Modification Date/Time     : 2013:07:19 12:03:22-10:00
File Permissions                : rw-r--r--
File Type                       : MOV
MIME Type                       : video/quicktime
Major Brand                     : Apple QuickTime (.MOV/QT)
Minor Version                   : 0.0.0
Compatible Brands               : qt
Movie Data Size                 : 19979709
Movie Header Version            : 0
Modify Date                     : 2013:07:19 22:03:21
Time Scale                      : 600
Duration                        : 7.27 s
Preferred Rate                  : 1
Preferred Volume                : 100.00%
Preview Time                    : 0 s
Preview Duration                : 0 s
Poster Time                     : 0 s
Selection Time                  : 0 s
Selection Duration              : 0 s
Current Time                    : 0 s
Next Track ID                   : 3
Track Header Version            : 0
Track Create Date               : 2013:07:19 22:03:13
Track Modify Date               : 2013:07:19 22:03:21
Track ID                        : 1
Track Duration                  : 7.27 s
Track Layer                     : 0
Track Volume                    : 0.00%
Image Width                     : 1920
Image Height                    : 1080
Graphics Mode                   : ditherCopy
Op Color                        : 32768 32768 32768
Compressor ID                   : avc1
Source Image Width              : 1920
Source Image Height             : 1080
X Resolution                    : 72
Y Resolution                    : 72
Compressor Name                 : H.264
Bit Depth                       : 24
Video Frame Rate                : 27.011
Camera Identifier               : Back
Frame Readout Time              : 28512 microseconds
Matrix Structure                : 1 0 0 0 1 0 0 0 1
Media Header Version            : 0
Media Create Date               : 2013:07:19 22:03:13
Media Modify Date               : 2013:07:19 22:03:21
Media Time Scale                : 44100
Media Duration                  : 7.31 s
Media Language Code             : und
Balance                         : 0
Handler Class                   : Data Handler
Handler Vendor ID               : Apple
Handler Description             : Core Media Data Handler
Audio Channels                  : 1
Audio Bits Per Sample           : 16
Audio Sample Rate               : 44100
Audio Format                    : chan
Model                           : iPhone 4S
Software Version                : 6.1.3
Create Date                     : 2013:07:20 08:03:13+10:00
Make                            : Apple
Handler Type                    : Metadata Tags
Make (und-AU)                   : Apple
Creation Date (und-AU)          : 2013:07:20 08:03:13+10:00
Software (und-AU)               : 6.1.3
Model (und-AU)                  : iPhone 4S
Avg Bitrate                     : 22 Mbps
Image Size                      : 1920x1080
Rotation                        : 90

如果我使用ffmpeg

 ffmpeg -i IMG_0014.MOV -f ffmetadata metadata.txt

输出结果为

;FFMETADATA1
major_brand=qt  
minor_version=0
compatible_brands=qt  
date-eng=2013-07-20T08:03:13+1000
encoder=6.1.3
encoder-eng=6.1.3
date=2013-07-20T08:03:13+1000


10
很遗憾,exiftool不允许将元数据保存回视频文件。 - Filipe Correia
2
如何通过ffmpeg获取节目指南(EPG)? - Dr.jacky
有没有 exiftoolAndroid 版本,已经在 exiftool 的网站上搜索过了,但是没有找到。 - Krishna Oza
1
@Filipe Correia,exiftool手册的NAME行说:“exiftool-读写文件中的元信息”,所以您能否更具体地说明您发表评论的原因? - David N. Jafferian
3
@DavidN.Jafferian 这个评论是2013年的,但是自那时以来,exiftool已经具备了向视频文件写入元数据的能力。 - Filipe Correia

28
你可以使用ffprobe(附带于ffmpeg)来收集有关多媒体文件的信息。要获取有关多媒体文件整体内容的信息,请使用
ffprobe -show_streams -show_format DV06xx.avi 

关于视频文件中每个单独帧的信息,请使用:

ffprobe -show_frames DV06xx.avi 

然而,ffprobe并不能像我最喜欢的工具Mediainfo那样获取大量信息,例如,'ffprobe'无法显示视频第一帧的时间码(尽管手册上声称可以),也无法显示录制日期。

如果在命令行上运行mediainfo,您甚至可以请求以XML格式输出:

mediainfo --OUTPUT=XML DV06xx.avi 

我的示例输出为:

<?xml version="1.0" encoding="UTF-8"?>
<Mediainfo version="0.7.63">
<File>
<track type="General">
<Complete_name>DV06xx.avi</Complete_name>
<Format>AVI</Format>
<Format_Info>Audio Video Interleave</Format_Info>
<Commercial_name>DVCPRO</Commercial_name>
<Format_profile>OpenDML</Format_profile>
<File_size>13.3 GiB</File_size>
<Duration>1h 2mn</Duration>
<Overall_bit_rate_mode>Constant</Overall_bit_rate_mode>
<Overall_bit_rate>30.5 Mbps</Overall_bit_rate>
<Recorded_date>2004-03-28 15:42:35.000</Recorded_date>
</track>

<track type="Video">
<ID>0</ID>
<Format>DV</Format>
<Commercial_name>DVCPRO</Commercial_name>
<Codec_ID>dvsd</Codec_ID>
<Codec_ID_Hint>Sony</Codec_ID_Hint>
<Duration>1h 2mn</Duration>
<Bit_rate_mode>Constant</Bit_rate_mode>
<Bit_rate>24.4 Mbps</Bit_rate>
<Encoded_bit_rate>28.8 Mbps</Encoded_bit_rate>
<Width>720 pixels</Width>
<Height>576 pixels</Height>
<Display_aspect_ratio>4:3</Display_aspect_ratio>
<Frame_rate_mode>Constant</Frame_rate_mode>
<Frame_rate>25.000 fps</Frame_rate>
<Standard>PAL</Standard>
<Color_space>YUV</Color_space>
<Chroma_subsampling>4:2:0</Chroma_subsampling>
<Bit_depth>8 bits</Bit_depth>
<Scan_type>Interlaced</Scan_type>
<Scan_order>Bottom Field First</Scan_order>
<Compression_mode>Lossy</Compression_mode>
<Bits__Pixel_Frame_>2.357</Bits__Pixel_Frame_>
<Time_code_of_first_frame>00:00:01:10</Time_code_of_first_frame>
<Time_code_source>Subcode time code</Time_code_source>
<Stream_size>12.6 GiB (94%)</Stream_size>
<Encoding_settings>ae mode=full automatic / wb mode=automatic / white balance= / fcm=manual focus</Encoding_settings>
</track>

<track type="Audio">
<ID>1</ID>
<Format>PCM</Format>
<Format_settings__Endianness>Little</Format_settings__Endianness>
<Format_settings__Sign>Signed</Format_settings__Sign>
<Codec_ID>1</Codec_ID>
<Duration>1h 2mn</Duration>
<Bit_rate_mode>Constant</Bit_rate_mode>
<Bit_rate>1 536 Kbps</Bit_rate>
<Channel_s_>2 channels</Channel_s_>
<Sampling_rate>48.0 KHz</Sampling_rate>
<Bit_depth>16 bits</Bit_depth>
<Stream_size>688 MiB (5%)</Stream_size>
<Alignment>Aligned on interleaves</Alignment>
<Interleave__duration>40 ms (1.00 video frame)</Interleave__duration>
<Interleave__preload_duration>40 ms</Interleave__preload_duration>
</track>

</File>
</Mediainfo>

添加可选参数-f将生成更详细的信息。


1
如何通过ffmpeg获取节目指南(EPG)? - Dr.jacky
mediainfo导出的内容并不一定是ffmpeg显示的“元数据”,例如标题、艺术家、曲目等。 - Meow
以json格式显示:ffprobe -print_format json -show_programs -show_format -show_streams "source.mp4" - the_RR

2
您可以设置视频的元数据,在下面提到设置专辑艺术家。
ffmpeg -i source.mp4 -metadata album_artist='stack developer' -y -r 1 -acodec copy -vcodec copy destination.mp4

并且可以通过以下方式获取meta标签:

ffmpeg -i destination.mp4

在命令行中使用此命令。


1

1
假设我需要帧数和持续时间。要使用MediaInfo cli获取这些信息,请使用以下代码。MediaInfo --inform="Video;%FrameCount%,%Duration/String4%" videoname.mp4 输出将类似于此 - 63525,00:42:21:00

0
我结合了bash、ffmpeg和sed,将我感兴趣的基本元数据信息写入文件中:文件类型和名称、标题、视频、音频和字幕流的详细信息。 可以处理单个文件或目录中的所有文件。 适用于Linux系统。 顺便提一下,这个脚本只在一堆mkv视频上进行过测试。
脚本名:ffmpeg_metadata.sh 输出文件:ffmpeg_metadata.txt
sed命令对给定的ffmpeg输出进行各种“净化”操作。
以下是代码片段,展示了脚本的部分功能(希望它能正常显示,因为我在这篇文章中遇到了换行问题)...
echo -e "File name(s) (specific or wildcard,
no spaces or special chars, except '-' '_')?"

read -p "" INPUT

echo

for i in ${INPUT}; do ffmpeg -i "$i" -hide_banner; done |& tee ./ffmpeg_metadata.txt

sed -r -i "/Input|title|Stream/!d;s/[[:space:]]*[[:space:]]/ /g;s/^[[:space:]]//g;s/[[:space:]]:/:/g;s/Input/\n&/g;1i MULTIMEDIA METADATA" ./ffmpeg_metadata.txt

这个/Input | title | Stream/! d表示:不要删除包含这些词或字符串的行。换句话说,只保留那些行。

对于两个mkv文件,结果如下:

多媒体元数据
从'film1.mkv'输入,格式为matroska,webm: 标题:film1 流 #0:0:视频:h264(高级),yuv420p(逐行扫描),1276x686 [SAR 1:1 DAR 638:343],SAR 343:359 DAR 638:359,23.97 fps,23.97 tbr,1k tbn,47.94 tbc(默认) 标题:film1_Track 流 #0:1:音频:aac(LC),48000 Hz,立体声,fltp(默认) 标题:film1_Track
从'film2.mkv'输入,格式为matroska,webm: 标题:film2 流 #0:0:视频:h264(高级),yuv420p(电视,bt709,逐行扫描),640x360 [SAR 1:1 DAR 16:9],25 fps,25 tbr,1k tbn,50 tbc(默认) 标题:film2_Track 流 #0:1(eng):音频:aac(LC),44100 Hz,立体声,fltp(默认) 标题:film2_Track 流 #0:2(eng):字幕:ass(默认) 标题:film2_Track 流 #0:3(es):字幕:subrip(默认) 标题:film2_Track
可以通过在sed中省略'title'来进一步减少。 所以,只保留文件名和流。 或者,例如,可以添加包含单词'Duration'的行,这些行还包括比特率。 等等,等等。 如果ffmpeg开发开始重新拼写单词,这个脚本也需要重新拼写 :-D
再见(不包括在输出文件中 ;-) )!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接