php - 如何在 PHP 中解析 ffmpeg 信息?

标签 php ffmpeg

如何从 ffmpeg -i/var/thismovie.avi 的输出中获取特定信息,例如“持续时间”?

我需要帧高、帧宽、电影持续时间和帧速率。所有这些都在上述命令的输出中,但我如何单独获取我需要的位并将它们放入 PHP 的变量中?

我已经放弃尝试安装 ffmpeg-php,这是我之前用来完成相同工作的。

谢谢

ffmpeg -i/var/thismovie.avi 产生这样的输出

ffmpeg version N-43171-ga763caf Copyright (c) 2000-2012 the FFmpeg developers built on Aug 3 2012 07:56:19 with gcc 4.1.2 (GCC) 20080704 (Red Hat 4.1.2-52) configuration: --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvpx --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-pic --enable-libx264 --enable-libxvid --disable-ffplay --enable-shared --enable-gpl --enable-postproc --enable-nonfree --enable-avfilter --enable-pthreads --extra-cflags=-fPIC libavutil 51. 66.100 / 51. 66.100 libavcodec 54. 48.100 / 54. 48.100 libavformat 54. 22.100 / 54. 22.100 libavdevice 54. 2.100 / 54. 2.100 libavfilter 3. 5.102 / 3. 5.102 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 [avi @ 0x18e8e240] non-interleaved AVI [avi @ 0x18e8e240] max_analyze_duration 5000000 reached at 5000000 Input #0, avi, from '/var/www/vhosts/mysite.com/httpdocs/movie.avi': Duration: 00:00:10.76, start: 0.000000, bitrate: 5180 kb/s Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 50 tbc Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, stereo, s16, 128 kb/s At least one output file must be specified` 

最佳答案

基于@blahdiblah 建议并受 another question 启发的 ffprobe 解决方案答案:https://github.com/paulofreitas/php-ffprobe

注意:需要ffmpeg 0.9+,支持所有ffmpeg支持的文件类型

使用类

// Example 1
$info = new ffprobe($filename);
var_dump($info->format->format_long_name); // e.g. string(10) "AVI format"
var_dump($info->streams[0]->duration);     // e.g. string(11) "5674.674675"

// Example 2 (prettified)
$info = new ffprobe($filename, true);
var_dump($info->format->format_long_name); // e.g. string(10) "AVI format"
var_dump($info->streams[0]->duration);     // e.g. string(14) "1:34:34.674675"

扩展类

class ffprobe_ext extends ffprobe
{
    public function __construct($filename)
    {
        parent::__construct($filename);
    }

    public function getVideoStream()
    {
        foreach ($this->streams as $stream) {
            if ($stream->codec_type == 'video') {
                return $stream;
            }
        }
    }

    public function getVideoInfo()
    {
        $stream = $this->getVideoStream();
        $info   = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
        $info->duration     = (float) $stream->duration;
        $info->frame_height = (int) $stream->height;
        $info->frame_width  = (int) $stream->width;
        eval("\$frame_rate = {$stream->r_frame_rate};");
        $info->frame_rate   = (float) $frame_rate;

        return $info;
    }
}

$ffprobe = new ffprobe_ext($filename);
$info = $ffprobe->getVideoInfo();
var_dump($info->duration); // e.g. float(5674.674675)

欢迎进一步改进! :-)

关于php - 如何在 PHP 中解析 ffmpeg 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11805207/

相关文章:

audio - 如何通过设置 20 位深度生成 pcm 音频文件?

FFMpeg DVB 字幕内存泄漏

php - 使用 on() 或 bind() 时如何获取选择器的属性?

php - 缓存动态页面/从缓存中排除部分

执行命令时 Swift 脚本卡住 (ffmpeg)

java - FFmpeg 命令帮助和文档指针

php laravel 返回 foreach 中的所有数据

php - php tidy 的替代品?

PHP 跟踪用户流量

video - ffmpeg 将字幕轨道设置为默认值