【问题标题】:exif_read_data vs exec(exiftool...)exif_read_data 与 exec(exiftool ...)
【发布时间】:2014-02-14 10:35:01
【问题描述】:

我有以下问题:

我在一个新继承的项目中从事维护工作。在这个项目中,开发人员以这种方式处理图像和视频的元数据:

function getRotationFromFile($realPath) {
    $retVal = Array();

    $cmd = variable_get("exiftool",null) . "\"$realPath\"" . " | grep -E 'Rotation|Camera Identifier'";
    exec($cmd, $output);

    foreach ($output as $row){
        $key = trim(strstr($row, ':', true));
        $value = trim(str_replace(": ", "", strstr($row, ': ')));
        $retVal[$key] = $value;
    }
    return $retVal;
}

如您所见,此函数调用 exec(exiftool..) 并检索一些元数据。 我知道在 php 中存在 exif_read_data,这样做也是一样的。

我的问题是:

  1. 最好的解决方案是什么?
  2. 谁的速度更快?
  3. 谁更“正确”?
  4. 最后,我尝试搜索,但我没有找到 exif_read_data 是否在源代码中使用 exiftool

提前谢谢你!

【问题讨论】:

    标签: php exec exiftool


    【解决方案1】:

    我创建了一个 PHP 脚本,它允许通过 exiftool 非常快速地读取/写入。 我们将它与 gearman 一起使用,因此它作为后台服务运行,exiftool 最慢的部分是启动它,然后通过将作业传递给 gearman 从 PHP 脚本中调用它。 我们运行了大约 5 个该脚本的实例,因此它可以快速提供服务。 单个进程应该能够在大约 1-2 秒内处理大约 100 个文件,这当然取决于文件大小和存储速度,但它确实可以很好地扩展。 过去 5 个月,我们的数字资产管理平台已将其用于生产环境。

    https://github.com/tsmgeek/ExifTool_PHP_Stayopen

    【讨论】:

      【解决方案2】:

      据我所知,exif_read_data 只会读取 EXIF 数据,不会读取任何其他类型的元数据,并且仅限于 Tiff 和 Jpg 文件。 EXIF 块很少出现在视频文件中。此外,您在该段代码中寻找的两个标签Camera IdentifierRotation 不是标签,属于EXIF 规范的一部分。 Camera Identifier 似乎是 Quicktime 标签,而 Rotation 似乎是 Nikon 和 Canon makernotes 标签。

      可以做的一件事是告诉 Exiftool 只显示你想要的标签,而不是通过 grep 管道它。这可以通过在命令行中添加-CameraIdentifier -Rotation 来完成。安静选项-q 也可能对此有用。

      您可能还想查看Orientation 标签,因为它是保存图像文件方向的标准标签。

      @tsmgeek 可能有最好的解决方案,因为他们对启动开销是正确的。

      【讨论】:

      • 感谢您花时间阅读这篇旧帖子,这是我所问的更完整的答案。
      • 嘿,我什至没有赶上日期。它刚刚弹出到 ExifTool 过滤器的顶部,所以我认为它是新的。
      【解决方案3】:

      PHP 函数exif_read_data 仅支持 JPEG 和 TIFF 文件类型。命令行实用程序exiftool - 更多。

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 2013-01-07
        • 2016-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-17
        • 2011-10-28
        相关资源
        最近更新 更多