Fix transcoding

This commit is contained in:
Chocobozzz 2020-01-29 16:54:03 +01:00
parent 14aa85562c
commit c7f36e4f48
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
4 changed files with 20 additions and 12 deletions

1
.gitignore vendored
View File

@ -12,6 +12,7 @@ yarn-error.log
/test5/ /test5/
/test6/ /test6/
/server/tests/fixtures/video_high_bitrate_1080p.mp4 /server/tests/fixtures/video_high_bitrate_1080p.mp4
/server/tests/fixtures/video_59fps.mp4
# Production # Production
/storage/ /storage/

View File

@ -263,8 +263,9 @@ async function canDoQuickTranscode (path: string): Promise<boolean> {
return true return true
} }
function getClosestFramerateStandard (fps: number, hd = false): number { function getClosestFramerateStandard (fps: number, type: 'HD_STANDARD' | 'STANDARD'): number {
return VIDEO_TRANSCODING_FPS[hd ? 'HD_STANDARD' : 'STANDARD'].slice(0).sort((a, b) => fps % a - fps % b)[0] return VIDEO_TRANSCODING_FPS[type].slice(0)
.sort((a, b) => fps % a - fps % b)[0]
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -294,12 +295,10 @@ async function buildx264Command (command: ffmpeg.FfmpegCommand, options: Transco
// On small/medium resolutions, limit FPS // On small/medium resolutions, limit FPS
options.resolution !== undefined && options.resolution !== undefined &&
options.resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN && options.resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN &&
fps > VIDEO_TRANSCODING_FPS.AVERAGE || fps > VIDEO_TRANSCODING_FPS.AVERAGE
// If the video is doesn't match hd standard
!VIDEO_TRANSCODING_FPS.HD_STANDARD.some(value => fps % value === 0)
) { ) {
// Get closest standard framerate by modulo: downsampling has to be done to a divisor of the nominal fps value // Get closest standard framerate by modulo: downsampling has to be done to a divisor of the nominal fps value
fps = getClosestFramerateStandard(fps) fps = getClosestFramerateStandard(fps, 'STANDARD')
} }
command = await presetH264(command, options.inputPath, options.resolution, fps) command = await presetH264(command, options.inputPath, options.resolution, fps)
@ -312,7 +311,7 @@ async function buildx264Command (command: ffmpeg.FfmpegCommand, options: Transco
if (fps) { if (fps) {
// Hard FPS limits // Hard FPS limits
if (fps > VIDEO_TRANSCODING_FPS.MAX) fps = getClosestFramerateStandard(fps, true) if (fps > VIDEO_TRANSCODING_FPS.MAX) fps = getClosestFramerateStandard(fps, 'HD_STANDARD')
else if (fps < VIDEO_TRANSCODING_FPS.MIN) fps = VIDEO_TRANSCODING_FPS.MIN else if (fps < VIDEO_TRANSCODING_FPS.MIN) fps = VIDEO_TRANSCODING_FPS.MIN
command = command.withFPS(fps) command = command.withFPS(fps)

View File

@ -423,7 +423,7 @@ describe('Test video transcoding', function () {
let tempFixturePath: string let tempFixturePath: string
{ {
tempFixturePath = await generateVideoWithFramerate() tempFixturePath = await generateVideoWithFramerate(59)
const fps = await getVideoFileFPS(tempFixturePath) const fps = await getVideoFileFPS(tempFixturePath)
expect(fps).to.be.equal(59) expect(fps).to.be.equal(59)
@ -443,10 +443,18 @@ describe('Test video transcoding', function () {
const res = await getVideosList(server.url) const res = await getVideosList(server.url)
const video = res.body.data.find(v => v.name === videoAttributes.name) const video = res.body.data.find(v => v.name === videoAttributes.name)
const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', video.uuid + '-240.mp4')
const fps = await getVideoFileFPS(path)
expect(fps).to.be.equal(25) {
const path = join(root(), 'test' + servers[ 1 ].internalServerNumber, 'videos', video.uuid + '-240.mp4')
const fps = await getVideoFileFPS(path)
expect(fps).to.be.equal(25)
}
{
const path = join(root(), 'test' + servers[ 1 ].internalServerNumber, 'videos', video.uuid + '-720.mp4')
const fps = await getVideoFileFPS(path)
expect(fps).to.be.equal(59)
}
} }
}) })

View File

@ -113,7 +113,7 @@ async function generateVideoWithFramerate (fps = 60) {
if (!exists) { if (!exists) {
return new Promise<string>(async (res, rej) => { return new Promise<string>(async (res, rej) => {
ffmpeg() ffmpeg()
.outputOptions([ '-f rawvideo', '-video_size 320x240', '-i /dev/urandom' ]) .outputOptions([ '-f rawvideo', '-video_size 1280x720', '-i /dev/urandom' ])
.outputOptions([ '-ac 2', '-f s16le', '-i /dev/urandom', '-t 10' ]) .outputOptions([ '-ac 2', '-f s16le', '-i /dev/urandom', '-t 10' ])
.outputOptions([ `-r ${fps}` ]) .outputOptions([ `-r ${fps}` ])
.output(tempFixturePath) .output(tempFixturePath)