uiharu/src/FFMPEG.php

72 lines
2.8 KiB
PHP

<?php
namespace Uiharu;
use stdClass;
final class FFMPEG {
public static function probe(string $url): ?object {
return json_decode(
shell_exec(
sprintf(
'ffprobe -show_streams -show_format -print_format json -v quiet -i %s',
escapeshellarg($url)
)
)
);
}
public static function cleanProbe(string $url): ?object {
return self::cleanProbeResult(self::probe($url));
}
public static function cleanProbeResult(?object $in): ?object {
if($in === null)
return null;
$out = new stdClass;
if(!empty($in->format)) {
$out->confidence = empty($in->format->probe_score) ? 0 : (intval($in->format->probe_score) / 100);
if(!empty($in->format->duration))
$out->duration = floatval($in->format->duration);
if(!empty($in->format->size))
$out->size = intval($in->format->size);
if(!empty($in->format->bit_rate))
$out->bitRate = intval($int->format->bit_rate);
if(!empty($in->format->tags)) {
$out->tagTitle = $in->format->tags->title ?? $in->format->tags->TITLE;
$out->tagArtist = $in->format->tags->artist ?? $in->format->tags->ARTIST;
$out->tagAlbum = $in->format->tags->album ?? $in->format->tags->ALBUM;
$out->tagDate = $in->format->tags->date ?? $in->format->tags->DATE;
$out->tagComment = $in->format->tags->comment ?? $in->format->tags->COMMENT;
$out->tagGenre = $in->format->tags->genre ?? $in->format->tags->GENRE;
}
}
if(!empty($in->streams))
foreach($in->streams as $stream) {
$codecType = $stream->codec_type ?? null;
if($codecType === 'video') {
$out->width = intval($stream->coded_width ?? $stream->width ?? -1);
$out->height = intval($stream->coded_height ?? $stream->height ?? -1);
if(!empty($stream->display_aspect_ratio))
$out->aspectRatio = $stream->display_aspect_ratio;
} elseif($codecType === 'audio') {
$out->tagTitle = $stream->tags->title ?? $stream->tags->TITLE;
$out->tagArtist = $stream->tags->artist ?? $stream->tags->ARTIST;
$out->tagAlbum = $stream->tags->album ?? $stream->tags->ALBUM;
$out->tagDate = $stream->tags->date ?? $stream->tags->DATE;
$out->tagComment = $stream->tags->comment ?? $stream->tags->COMMENT;
$out->tagGenre = $stream->tags->genre ?? $stream->tags->GENRE;
}
}
return $out;
}
}