建站之视频处理

借助 ffmpeg 扩展处理视频。包括自动旋转、截图、转换格式等。

ubuntu 下安装扩展

sudo apt-get install ffmpeg

获取视频尺寸、旋转角度

/**
 * /usr/bin/ffprobe video.mp4 -show_streams -print_format json
 */
public static function info($video)
{
    $raw = shell_exec(sprintf('%s %s -show_streams -print_format json', self::ffprobe(), $video));
    if (empty($raw) || !($raw = json_decode($raw, true)) || empty($raw['streams'])) {
        return false;
    }

    foreach ($raw['streams'] as $v) {
        if (VIDEO == $v['codec_type']) {
            $data = $v;
            break;
        }
    }

    return [
        WIDTH  => format_integer($data[WIDTH]),
        HEIGHT => format_integer($data[HEIGHT]),
        ROTATE => isset($data[TAGS][ROTATE]) ? format_integer($data[TAGS][ROTATE]) : 0,
    ];
}

旋转视频

/**
 * /usr/bin/ffmpeg -y -i video.mp4 -strict -2 video.mp4_new.mp4
 */
public static function rotate($video)
{
    if (!($info = self::info($video))) {
        return false;
    }

    if ($info[ROTATE]) {
        $tmpVideo = $video . '_new.mp4';
        shell_exec(sprintf('%s -y -i %s -strict -2 %s', self::ffmpeg(), $video, $tmpVideo));
        if (File::exist($tmpVideo)) {
            File::delete($video);
            File::rename($tmpVideo, $video);
        }
    }
}

生成视频缩略图

/**
 * /usr/bin/ffmpeg -i video.mp4 -y -f image2 -t 0.001 -s 800x600 video.mp4_tmp.jpg
 */
public static function createTmpImage($video)
{
    if (!($info = self::info($video))) {
        return false;
    }

    $image = self::getTmpImageFile($video);

    shell_exec(sprintf('%s -i %s -y -f image2 -t 0.001 -s %dx%d %s', self::ffmpeg(), $video, $info[WIDTH], $info[HEIGHT], $image));

    return File::exist($image) ? $image : false;
}

生成 webm

/**
 * /usr/bin/ffmpeg -i video.mp4 video.webm
 */
public static function webm($video)
{
    if (!($videoFile = File::exist($video))) {
        return '';
    }
    $webmFile = self::getWebmFile($videoFile);
    shell_exec(sprintf('%s -i %s %s', self::ffmpeg(), $videoFile, $webmFile));
}
2017 年 5 月 18 日 午夜
添加