在 php 中获取视频分辨率,最可靠的方式是使用 ffprobe 命令行工具或 ffmpeg 扩展库来解析视频文件的元数据。通过调用 ffprobe 并指定输出格式为 json,可以精确提取视频流的宽度和高度信息,从而避免加载整个视频文件带来的性能损耗。

如何使用 ffprobe 命令行直接获取分辨率
使用 ffprobe 命令可以直接从终端或 PHP 的 shell_exec 函数中获取视频的宽高。这种方法不需要安装额外的 PHP 扩展,只需服务器安装了 FFmpeg 套件即可。通过设置 -select_streams v:0 和 -show_entries stream=width,height 参数,可以过滤出只包含第一路视频流的尺寸信息,返回结果通常为 JSON 格式,便于后续解析。

{
"streams": [
{
"width": 1920,
"height": 1080
}
]
}
在 PHP 代码中,可以通过 exec() 或 shell_exec() 执行上述命令,并将输出的 JSON 字符串解码为数组。如果视频文件损坏或多流冲突,ffprobe 可能会返回空结果或错误码,因此需要检查返回值是否为空以及 HTTP 状态码(如果是远程 URL)是否正常。对于本地文件,确保 PHP 进程有读取权限;对于远程文件,需确保网络通畅且支持 http:// 或 https:// 协议访问。
立即学习“PHP免费学习笔记(深入)”;
本地 Ollama 文生图工具。使用 x/z-image-turbo 模型生成图片,分辨率 1024x1024,每张图约耗时 90 秒。当用户说"生成图片"、"文生图"、"画一张图"、或提交中文提示词生成图像时使用。
如何在 PHP 中使用 FFMpeg 库解析视频
如果使用 FFMpeg PHP 库,可以通过 getVideoDimensions() 方法直接获取分辨率。该库封装了 ffprobe 的调用逻辑,提供了更面向对象的 API。首先需要实例化 FFMpeg\FFMpeg 对象,然后打开视频文件,调用 getVideoDimensions() 返回一个 Coordinate 对象,从中提取 x(宽)和 y(高)属性。这种方式代码更简洁,适合在大型项目中使用。

$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('path/to/video.mp4');
$dimensions = $video->getVideoDimensions();
$width = $dimensions->getX();
$height = $dimensions->getY();
echo "Width: $width, Height: $height";
在使用 FFMpeg 库时,需注意依赖项的版本兼容性。通常要求 PHP 7.2+ 和 FFmpeg 3.2+。如果视频文件较大,getVideoDimensions() 会快速读取头部元数据,不会解码整个视频,因此性能开销较小。若遇到 InvalidArgumentException,通常是因为文件路径错误或文件格式不被支持。建议在生产环境中缓存分辨率结果,避免重复解析同一文件。
当视频文件无视频流时 ffprobe 返回什么
当视频文件中不包含任何视频流(例如纯音频文件或损坏的文件)时,ffprobe 的 JSON 输出中 streams 数组将为空,或者在 FFMpeg 库中调用 getVideoDimensions() 会抛出异常。此时,PHP 代码应捕获这种情况并返回默认值或错误提示。例如,在手动解析 JSON 时,检查 count($data['streams']) === 0 来判断是否无视频流;在使用库时,使用 try-catch 块捕获 Exception。


















