1

我有以下问题:

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

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

先感谢您!

4

3 回答 3

4

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

https://github.com/tsmgeek/ExifTool_PHP_Stayopen

于 2014-03-17T15:25:11.933 回答
1

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

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

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

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

于 2016-09-26T22:33:28.593 回答
0

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

于 2016-09-26T10:20:22.047 回答