获取托管在Amazon S3上的文件的视频持续时间


Get video duration of file hosted on Amazon S3

我正在创建一个分发视频的门户网站。我们的想法是将视频上传到Amazon S3,并使用PHP从服务器收集必要的数据。到目前为止一切都很好……我唯一不能得到的是视频的持续时间:-(谁能给我一个提示,如何完成它?

谢谢,米格尔

更新:

我最终选择使用FFmpeg。我已经在服务器上安装了FFmpeg,现在我正在尝试在shell中执行命令,然后再用PHP执行它。我从亚马逊传递它的URL(我尝试了cloudfront URL和S3 URL),但它说没有这样的目录或文件。我在网上看到过使用外部文件的例子,所以我希望它能工作。

我使用的命令是

ffmpeg -i https://s3-eu-west-1.amazonaws.com/path/to/file.m4v

是否有一些我需要配置,以使用外部url ?

如果您不想使用FFmpeg(或者无法在服务器上安装它),另一个选择是在视频文件的嵌入元数据中查找持续时间。

通常存储在一个或多个名为"Duration"或"PlayDuration"的标签中。

您可以使用ExifTool之类的工具从视频文件中读取嵌入的元数据,然后解析输出中的标签。

也许我的代码将帮助某人获得S3视频文件持续时间。如果没有看到元数据(使用FilesystemInterface提供的getMetadata()方法),则需要在机器/服务器上安装ffmpeg。然后安装这个包:https://github.com/PHP-FFMpeg/PHP-FFMpeg

现在,我将向您提供我的代码。这不是最好的,因为我需要将它作为命令运行,只有一次。

public static function getVideoDurationInMilliseconds(?string $path): ?float
    {
        if ($path === null) {
            return null;
        }
        // Basically you need only something like this
        // videos/s/jtr40wdcmc/teflon_vs_velcro.mp4
        $filePath = str_replace('https://YOUR_S3_USER-userprofiles.s3.YOUR_REGION.amazonaws.com/', '', $path);
        ini_set('memory_limit', '-1'); // this code is really memory exhaustive
        $localStorage = 'Storage::disk('local');
        $s3 = 'Storage::disk('s3');
        $ffProbe = FFProbe::create();
        try {
            $contents = $s3->assertExists($filePath)
                ->get($filePath);
            $fileName = $s3->getMetadata($filePath)['basename'];
            $localStorage->put($fileName, $contents);
            $durationInSeconds = $ffProbe->format($localStorage->path($fileName))
                ->get('duration');
            $localStorage->delete($fileName);
        } catch (ExpectationFailedException $ex) {
            'Log::alert('File with path: ' . $filePath . ' does not exists on S3.', [$ex]);
            return null;
        } catch ('Exception $ex) {
            'Log::alert('Could not process S3 file: ' . $filePath, [$ex]);
        }
        return is_numeric($durationInSeconds)
            ? ((float) $durationInSeconds) * 1000
            : null;
    }

Code从S3获取文件,在本地保存,使用ffmpeg包检查持续时间,然后删除文件。

LongTail有一个使用PHP和FFMPeg的示例代码片段http://www.longtailvideo.com/support/forums/jw-player/setup-issues-and-embedding/9448/how-to-get-video-duration-with-ffmpeg-and-php

似乎是另一个解决方案:http://www.jqueryphp.com/getting-video-duration-with-ffmpeg-php-function/2009/10/

您需要在服务器上安装FFMpeg

还有一个可能的解决方案。当您将视频文件放入S3桶时,您需要设置对象元数据。

为了在一个对象上设置用户元数据,在头值的前面加上'x-amz-meta-'