我试图使用 exif-js 从 mp4 文件中获取 EXIF 数据,但没有成功。 我的代码附在下面。
图像部分工作正常,但视频部分不行。
https://github.com/exif-js/exif-js?tab=readme-ov-file 根据exif-js页面,通过调用EXIF.enableXmp();来支持XMP, 我把它放在调用从 mp4 文件获取 EXIF 数据之前。
据我所知,XMP 用于在视频文件中存储元数据(如 EXIF)。 https://www.quora.com/What-is-the-equivalent-of-EXIF-for-videos-What-are-easy-ways-to-view-the-data
知道如何修复代码吗?
非常感谢!
周末愉快:)
热烈的问候,
博士。
更新: 视频中的元数据包含“Make”和“Model”似乎并不常见, 所以我刚刚选择了 GPS 纬度,它在 jpg 和 mp4 中似乎更常见。 exiftool 输出添加在最后。 您可以尝试以下代码:http://doc.uk.to/test/ 并下载内容 test.jpg 和 test.mp4 。 这些内容其实是我顺便拍的,请欣赏:)
<!Doctype html>
<head>
<title> EXIF movies test </title>
</head>
<script src="https://cdn.jsdelivr.net/npm/exif-js"></script>
<script type=text/javascript>
window.onload=getExif;
function getExif() {
var img1 = document.getElementById("img1");
EXIF.getData(img1, function() {
var make = EXIF.getTag(this, "Make");
var model = EXIF.getTag(this, "Model");
var GpsLatitude = EXIF.getTag(this, "GPSLatitude");
var makeAndModel = document.getElementById("makeAndModel");
makeAndModel.innerHTML = `${make} ${model} ${GpsLatitude}`;
});
EXIF.enableXmp();
var img2 = document.getElementById("img2");
EXIF.getData(img2, function() {
var myData =this;
var make = "A"; //EXIF.getTag(this, "Make");
var model = "B"; //EXIF.getTag(this, "Model");
var GpsLatitude = EXIF.getTag(this, "GPSLatitude");
var makeAndModel2 = document.getElementById("makeAndModel2");
makeAndModel2.innerHTML = `${make} ${model} ${GpsLatitude}`;
var allMetaData = EXIF.getAllTags(this);
var allMetaDataSpan = document.getElementById("allMetaDataSpan");
allMetaDataSpan.innerHTML = JSON.stringify(allMetaData, null, "\t");
});
}
</script>
<body>
<img width=400 src="test.jpg" id="img1" />
<pre>Make and model: <span id="makeAndModel"></span></pre>
<br/>
<!--<img src="test.mp4" id="img2" />-->
<!--
<video id="img2" autoplay muted width="560" height="315" controls >
<source src="test.mp4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></video>
-->
<iframe id= "img2" width="560" height="315" src="test.mp4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<pre>Make and model2: <span id="makeAndModel2"></span></pre>
<pre id="allMetaDataSpan"></pre>
<br/>
</body>
</html>
$ exiftool test.jpg | grep "GPS Latitude"
GPS Latitude Ref : South
GPS Latitude : 3 deg 8' 50.92" S
$ exiftool test.mp4 | grep "GPS Latitude"
GPS Latitude : 24 deg 19' 55.51" N
GPS Latitude Ref : North
不,两个文件的元数据格式不同:
exiftool -v2 http://doc.uk.to/test/test.jpg
产生以下输出(不相关的行替换为 ...
):
JPEG APP1 (13812 bytes): ExifByteOrder = MM + [IFD0 directory with 14 entries] ... | 11) GPSInfo (SubDirectory) --> | - Tag 0x8825 (4 bytes, int32u[1]) | + [GPS directory with 4 entries] | | 0) GPSLatitudeRef = S | | - Tag 0x0001 (2 bytes, string[2]) | | 1) GPSLatitude = 3 8 50.9153713 (3/1 8/1 509153713/10000000) | | - Tag 0x0002 (24 bytes, rational64u[3]) | | 2) GPSLongitudeRef = E | | - Tag 0x0003 (2 bytes, string[2]) | | 3) GPSLongitude = 35 33 24.05090632 (35/1 33/1 2405090632/100000000) | | - Tag 0x0004 (24 bytes, rational64u[3]) ...
这意味着JFIF文件包含
APP1
段,标识为 Exif。
IFD0
)第12个条目(从0开始计数)指向GPS目录,
exiftool -v2 http://doc.uk.to/test/test.mp4
产生:
... XMP (SubDirectory) --> - Tag 'uuid' (2883 bytes) + [XMP directory, 2867 bytes] | XMPToolkit = Image::ExifTool 12.76 | GPSLatitude = 24,19.92517515N | - Tag 'x:xmpmeta/rdf:RDF/rdf:Description/exif:GPSLatitude' | GPSLongitude = 123,56.41529555E | - Tag 'x:xmpmeta/rdf:RDF/rdf:Description/exif:GPSLongitude' ...
这意味着ISO容器有
uuid
原子,标识为 XMP,
Exif 和 XMP 是两种不同的格式 - 不要将每种元数据格式都与 Exif 混淆。
ExifTool 这个名字有历史原因,因为一开始它只是想支持 Exif,但现在它可以读取更多格式,甚至是专有格式。
Exif.js 声明:
用于从图像文件读取 EXIF 元数据的 JavaScript 库。
明白了吗? 图像文件。没有提及 video 容器。即使这样也是错误的,因为它只支持 JFIF 图片格式。从中,它不仅可以读取 Exif,还可以读取 XMP 和 IPTC。它甚至不会尝试读取其他文件格式 - 甚至其他图片格式。而且(像许多人一样)他们错误地将 Exif 全部大写。那个图书馆不值钱。