如何在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
相关产品推荐
相关产品推荐

