我结合了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
再见(不包括在输出文件中 ;-) )!