forked from leftypol/leftypol
Merge pull request 'Improve webm multitrack support' (#154) from fix-ffmpeg into config
Reviewed-on: leftypol/leftypol#154
This commit is contained in:
commit
0ca1e3aab3
1 changed files with 67 additions and 33 deletions
|
|
@ -18,7 +18,7 @@ function get_webm_info($filename) {
|
|||
$webminfo['error'] = $validcheck['error'];
|
||||
if (empty($webminfo['error'])) {
|
||||
$trackmap = $validcheck['trackmap'];
|
||||
$videoidx = $trackmap['videoat'][0];
|
||||
$videoidx = $trackmap['videoat'][$validcheck['video_idx']];
|
||||
$webminfo['width'] = $ffprobe_out['streams'][$videoidx]['width'];
|
||||
$webminfo['height'] = $ffprobe_out['streams'][$videoidx]['height'];
|
||||
$webminfo['duration'] = $ffprobe_out['format']['duration'];
|
||||
|
|
@ -50,19 +50,43 @@ function locate_webm_tracks($ffprobe_out) {
|
|||
}
|
||||
}
|
||||
|
||||
return [ 'videoat' => $video_at, 'audioat' => $audio_at, 'others' => $others ];
|
||||
return [ 'videoat' => $video_at, 'audioat' => $audio_at ];
|
||||
}
|
||||
|
||||
function is_valid_webm($ffprobe_out) {
|
||||
/**
|
||||
* @param string $ffprobe_out
|
||||
* @return array<array> An array with the following values:
|
||||
* error: array with error code and message
|
||||
* trackmap: decoded ffprobe output
|
||||
* video_idx: int, index of the video track
|
||||
* audio_idx: ?int, index of the audio track, if present
|
||||
*/
|
||||
function is_valid_webm(array $ffprobe_out) {
|
||||
global $config;
|
||||
|
||||
if (empty($ffprobe_out)) {
|
||||
return [ 'error' => [ 'code' => 1, 'msg' => $config['error']['genwebmerror'] ] ];
|
||||
}
|
||||
if ($ffprobe_out['format']['duration'] > $config['webm']['max_length']) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 4,
|
||||
'msg' => sprintf($config['error']['webmtoolong'], $config['webm']['max_length']) . 'error 6'
|
||||
]
|
||||
];
|
||||
}
|
||||
if ((count($ffprobe_out['streams']) > 1) && (!$config['webm']['allow_audio'])) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 3,
|
||||
'msg' => $config['error']['webmhasaudio'] . 'error 4'
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
$trackmap = locate_webm_tracks($ffprobe_out);
|
||||
|
||||
// one video track
|
||||
if (count($trackmap['videoat']) != 1) {
|
||||
if (count($trackmap['videoat']) < 1) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 2,
|
||||
|
|
@ -70,9 +94,20 @@ function is_valid_webm($ffprobe_out) {
|
|||
]
|
||||
];
|
||||
}
|
||||
$videoidx = $trackmap['videoat'][0];
|
||||
if (count($trackmap['audioat']) != 0 && !$config['webm']['allow_audio']) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 3,
|
||||
'msg' => $config['error']['webmhasaudio'] . 'error 5'
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
$audio_idx = count($trackmap['audioat']) > 0 ? 0 : null;
|
||||
$video_idx = 0;
|
||||
|
||||
$extension = \pathinfo($ffprobe_out['format']['filename'], \PATHINFO_EXTENSION);
|
||||
|
||||
$extension = pathinfo($ffprobe_out['format']['filename'], PATHINFO_EXTENSION);
|
||||
if ($extension === 'webm' && !stristr($ffprobe_out['format']['format_name'], 'mp4')) {
|
||||
if ($ffprobe_out['format']['format_name'] != 'matroska,webm') {
|
||||
return [
|
||||
|
|
@ -83,8 +118,28 @@ function is_valid_webm($ffprobe_out) {
|
|||
];
|
||||
}
|
||||
} elseif ($extension === 'mp4' || stristr($ffprobe_out['format']['format_name'], 'mp4')) {
|
||||
$any_h264 = false;
|
||||
for ($i = 0; $i < count($trackmap['videoat']); $i++) {
|
||||
if ($ffprobe_out['streams'][$i]['codec_name'] == 'h264') {
|
||||
$video_idx = $i;
|
||||
$any_h264 = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$any_aac = false;
|
||||
if ($audio_idx !== null) {
|
||||
for ($i = 0; $i < count($trackmap['audioat']); $i++) {
|
||||
if ($ffprobe_out['streams'][$i]['codec_name'] == 'h264') {
|
||||
$audio_idx = $i;
|
||||
$any_aac = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If the video is not h264 or (there is audio but it's not aac).
|
||||
if (($ffprobe_out['streams'][$videoidx]['codec_name'] != 'h264') || ((count($trackmap['audioat']) > 0) && ($ffprobe_out['streams'][$trackmap['audioat'][0]]['codec_name'] != 'aac'))) {
|
||||
if (!$any_h264 || ($audio_idx !== null && !$any_aac)) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 2,
|
||||
|
|
@ -100,33 +155,12 @@ function is_valid_webm($ffprobe_out) {
|
|||
]
|
||||
];
|
||||
}
|
||||
if ((count($ffprobe_out['streams']) > 1) && (!$config['webm']['allow_audio'])) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 3,
|
||||
'msg' => $config['error']['webmhasaudio'] . 'error 4'
|
||||
]
|
||||
];
|
||||
}
|
||||
if ((count($trackmap['audioat']) > 0) && !$config['webm']['allow_audio']) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 3,
|
||||
'msg' => $config['error']['webmhasaudio'] . 'error 5'
|
||||
]
|
||||
];
|
||||
}
|
||||
if ($ffprobe_out['format']['duration'] > $config['webm']['max_length']) {
|
||||
return [
|
||||
'error' => [
|
||||
'code' => 4,
|
||||
'msg' => sprintf($config['error']['webmtoolong'], $config['webm']['max_length']) . 'error 6'
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'error' => [],
|
||||
'trackmap' => $trackmap
|
||||
'trackmap' => $trackmap,
|
||||
'video_idx' => $video_idx,
|
||||
'audio_idx' => $audio_idx
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue