You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中提取上传视频文件的元数据?

嘿,很高兴看到你已经搞定了基础的文件上传和存储,接下来提取视频元数据这块我刚好有几个实用的方案,咱们一步步来:

方案1:用FFmpeg提取元数据(最通用可靠)

FFmpeg是处理音视频的瑞士军刀,几乎能搞定所有视频格式的元数据提取,大多数服务器也都支持安装它。

步骤1:确保服务器安装了FFmpeg

先在服务器上验证是否安装:

ffmpeg -version

如果没装,用包管理器安装(比如Ubuntu用apt install ffmpeg,CentOS用yum install ffmpeg)。

步骤2:PHP中调用ffprobe提取元数据

ffprobe是FFmpeg自带的工具,专门用来解析媒体文件的元数据,我们可以用它输出JSON格式的结果,方便PHP解析:

// 假设上传后的视频文件路径是$uploadedFile
$uploadedFile = $_FILES['video']['tmp_name']; // 或者你存储后的文件路径

// 调用ffprobe获取JSON格式的元数据
$command = "ffprobe -v quiet -print_format json -show_format -show_streams " . escapeshellarg($uploadedFile);
$output = shell_exec($command);
$metadata = json_decode($output, true);

// 提取关键信息示例
if ($metadata) {
    // 视频时长(秒)
    $duration = isset($metadata['format']['duration']) ? floatval($metadata['format']['duration']) : 0;
    // 视频分辨率
    $width = 0;
    $height = 0;
    foreach ($metadata['streams'] as $stream) {
        if ($stream['codec_type'] == 'video') {
            $width = $stream['width'];
            $height = $stream['height'];
            break;
        }
    }
    // 视频编码格式
    $codec = isset($metadata['streams'][0]['codec_name']) ? $metadata['streams'][0]['codec_name'] : '';
    // 文件大小(字节)
    $fileSize = isset($metadata['format']['size']) ? intval($metadata['format']['size']) : 0;
}
方案2:纯PHP扩展GetID3(无需外部工具)

如果你的服务器没法装FFmpeg,GetID3是个不错的替代,它是一个纯PHP类库,能解析多种媒体格式的元数据。

步骤1:安装GetID3

可以直接从GitHub下载源码,或者用Composer安装:

composer require james-heinrich/getid3

步骤2:PHP中使用GetID3提取元数据

require_once 'path/to/getid3/getid3.php';

$getID3 = new getID3();
$fileInfo = $getID3->analyze($uploadedFile);

// 提取关键信息示例
if ($fileInfo) {
    $duration = isset($fileInfo['playtime_seconds']) ? $fileInfo['playtime_seconds'] : 0;
    $width = isset($fileInfo['video']['resolution_x']) ? $fileInfo['video']['resolution_x'] : 0;
    $height = isset($fileInfo['video']['resolution_y']) ? $fileInfo['video']['resolution_y'] : 0;
    $codec = isset($fileInfo['video']['codec']) ? $fileInfo['video']['codec'] : '';
    $fileSize = $fileInfo['filesize'];
}
将元数据存入MySQL的answers表

假设你的answers表已经有对应的字段(比如duration, width, height, codec, file_size等),接下来就可以把提取到的元数据和视频信息一起插入:

// 假设你已经有数据库连接$pdo
$stmt = $pdo->prepare("INSERT INTO answers (video_path, duration, width, height, codec, file_size, created_at) 
                      VALUES (:video_path, :duration, :width, :height, :codec, :file_size, NOW())");

$stmt->execute([
    ':video_path' => $yourStoredVideoPath, // 你存储视频的路径
    ':duration' => $duration,
    ':width' => $width,
    ':height' => $height,
    ':codec' => $codec,
    ':file_size' => $fileSize
]);

一些注意事项

  • 记得处理错误:比如ffprobe调用失败、GetID3解析失败的情况,要加入错误判断,避免插入无效数据。
  • 权限问题:确保PHP进程有执行ffprobe的权限,以及读取上传文件的权限。
  • 大文件处理:如果视频文件很大,解析元数据可能需要一点时间,考虑设置合理的PHP执行时间限制。

内容的提问来源于stack exchange,提问作者user9608348

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:44:18