如何通过客户端javascript从视频文件中获取EXIF信息?

问题描述 投票:0回答:1

我试图使用 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
javascript mp4 exif xmp exif-js
1个回答
0
投票

不,两个文件的元数据格式不同:

  1. 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目录,
        • 每个 GPS 详细信息有 4 个条目。
  2. 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
      • 这只是纯 XML,需要解析 GPS 详细信息。我们还看到有人立即使用 ExifTool 将此元数据写入文件。

Exif 和 XMP 是两种不同的格式 - 不要将每种元数据格式都与 Exif 混淆。

  • ExifTool 这个名字有历史原因,因为一开始它只是想支持 Exif,但现在它可以读取更多格式,甚至是专有格式

  • Exif.js 声明:

    用于从图像文件读取 EXIF 元数据的 JavaScript 库。

    明白了吗? 图像文件。没有提及 video 容器。即使这样也是错误的,因为它只支持 JFIF 图片格式。从中,它不仅可以读取 Exif,还可以读取 XMP 和 IPTC。它甚至不会尝试读取其他文件格式 - 甚至其他图片格式也不会。

© www.soinside.com 2019 - 2024. All rights reserved.