mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-10-04 10:19:35 +02:00
Improve target bitrate calculation
This commit is contained in:
parent
c826f34a45
commit
679c12e69c
24 changed files with 263 additions and 204 deletions
|
@ -1,5 +1,6 @@
|
|||
import * as ffmpeg from 'fluent-ffmpeg'
|
||||
import { getMaxBitrate, VideoFileMetadata, VideoResolution } from '../../shared/models/videos'
|
||||
import { getMaxBitrate } from '@shared/core-utils'
|
||||
import { VideoFileMetadata, VideoResolution, VideoTranscodingFPS } from '../../shared/models/videos'
|
||||
import { CONFIG } from '../initializers/config'
|
||||
import { VIDEO_TRANSCODING_FPS } from '../initializers/constants'
|
||||
import { logger } from './logger'
|
||||
|
@ -75,7 +76,7 @@ function getMaxAudioBitrate (type: 'aac' | 'mp3' | string, bitrate: number) {
|
|||
}
|
||||
}
|
||||
|
||||
async function getVideoStreamSize (path: string, existingProbe?: ffmpeg.FfprobeData) {
|
||||
async function getVideoStreamSize (path: string, existingProbe?: ffmpeg.FfprobeData): Promise<{ width: number, height: number }> {
|
||||
const videoStream = await getVideoStreamFromFile(path, existingProbe)
|
||||
|
||||
return videoStream === null
|
||||
|
@ -146,7 +147,10 @@ async function getVideoFileResolution (path: string, existingProbe?: ffmpeg.Ffpr
|
|||
const size = await getVideoStreamSize(path, existingProbe)
|
||||
|
||||
return {
|
||||
videoFileResolution: Math.min(size.height, size.width),
|
||||
width: size.width,
|
||||
height: size.height,
|
||||
ratio: Math.max(size.height, size.width) / Math.min(size.height, size.width),
|
||||
resolution: Math.min(size.height, size.width),
|
||||
isPortraitMode: size.height > size.width
|
||||
}
|
||||
}
|
||||
|
@ -243,7 +247,7 @@ async function canDoQuickVideoTranscode (path: string, probe?: ffmpeg.FfprobeDat
|
|||
const videoStream = await getVideoStreamFromFile(path, probe)
|
||||
const fps = await getVideoFileFPS(path, probe)
|
||||
const bitRate = await getVideoFileBitrate(path, probe)
|
||||
const resolution = await getVideoFileResolution(path, probe)
|
||||
const resolutionData = await getVideoFileResolution(path, probe)
|
||||
|
||||
// If ffprobe did not manage to guess the bitrate
|
||||
if (!bitRate) return false
|
||||
|
@ -253,7 +257,7 @@ async function canDoQuickVideoTranscode (path: string, probe?: ffmpeg.FfprobeDat
|
|||
if (videoStream['codec_name'] !== 'h264') return false
|
||||
if (videoStream['pix_fmt'] !== 'yuv420p') return false
|
||||
if (fps < VIDEO_TRANSCODING_FPS.MIN || fps > VIDEO_TRANSCODING_FPS.MAX) return false
|
||||
if (bitRate > getMaxBitrate(resolution.videoFileResolution, fps, VIDEO_TRANSCODING_FPS)) return false
|
||||
if (bitRate > getMaxBitrate({ ...resolutionData, fps })) return false
|
||||
|
||||
return true
|
||||
}
|
||||
|
@ -278,7 +282,7 @@ async function canDoQuickAudioTranscode (path: string, probe?: ffmpeg.FfprobeDat
|
|||
return true
|
||||
}
|
||||
|
||||
function getClosestFramerateStandard (fps: number, type: 'HD_STANDARD' | 'STANDARD'): number {
|
||||
function getClosestFramerateStandard <K extends keyof Pick<VideoTranscodingFPS, 'HD_STANDARD' | 'STANDARD'>> (fps: number, type: K) {
|
||||
return VIDEO_TRANSCODING_FPS[type].slice(0)
|
||||
.sort((a, b) => fps % a - fps % b)[0]
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue