Browse Source

Do not transcode to an higher bitrate

Thanks bkil https://github.com/bkil
pull/3342/head
Chocobozzz 1 week ago
parent
commit
d218e7de94
No known key found for this signature in database GPG Key ID: 583A612D890159BE
5 changed files with 59 additions and 3 deletions
  1. +6
    -1
      server/helpers/ffmpeg-utils.ts
  2. +37
    -0
      server/tests/api/videos/video-transcoder.ts
  3. BIN
      server/tests/fixtures/low-bitrate.mp4
  4. +8
    -1
      shared/extra-utils/miscs/miscs.ts
  5. +8
    -1
      shared/extra-utils/server/servers.ts

+ 6
- 1
server/helpers/ffmpeg-utils.ts View File

@@ -674,7 +674,12 @@ async function presetH264 (command: ffmpeg.FfmpegCommand, input: string, resolut
// Constrained Encoding (VBV)
// https://slhck.info/video/2017/03/01/rate-control.html
// https://trac.ffmpeg.org/wiki/Limiting%20the%20output%20bitrate
const targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS)
let targetBitrate = getTargetBitrate(resolution, fps, VIDEO_TRANSCODING_FPS)

// Don't transcode to an higher bitrate than the original file
const fileBitrate = await getVideoFileBitrate(input)
targetBitrate = Math.min(targetBitrate, fileBitrate)

localCommand = localCommand.outputOptions([ `-maxrate ${targetBitrate}`, `-bufsize ${targetBitrate * 2}` ])

// Keyframe interval of 2 seconds for faster seeking and resolution switching.


+ 37
- 0
server/tests/api/videos/video-transcoder.ts View File

@@ -20,6 +20,7 @@ import {
generateHighBitrateVideo,
generateVideoWithFramerate,
getMyVideos,
getServerFileSize,
getVideo,
getVideoFileMetadataUrl,
getVideosList,
@@ -27,6 +28,7 @@ import {
root,
ServerInfo,
setAccessTokensToServers,
updateCustomSubConfig,
uploadVideo, uploadVideoAndGetId,
waitJobs,
webtorrentAdd
@@ -468,6 +470,41 @@ describe('Test video transcoding', function () {
}
})

it('Should not transcode to an higher bitrate than the original file', async function () {
this.timeout(160000)

const config = {
transcoding: {
enabled: true,
resolutions: {
'240p': true,
'360p': true,
'480p': true,
'720p': true,
'1080p': true
},
webtorrent: { enabled: true },
hls: { enabled: true }
}
}
await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)

const videoAttributes = {
name: 'low bitrate',
fixture: 'low-bitrate.mp4'
}

const resUpload = await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes)
const videoUUID = resUpload.body.video.uuid

await waitJobs(servers)

const resolutions = [ 240, 360, 480, 720, 1080 ]
for (const r of resolutions) {
expect(await getServerFileSize(servers[1], `videos/${videoUUID}-${r}.mp4`)).to.be.below(43)
}
})

it('Should provide valid ffprobe data', async function () {
this.timeout(160000)



BIN
server/tests/fixtures/low-bitrate.mp4 View File


+ 8
- 1
shared/extra-utils/miscs/miscs.ts View File

@@ -4,7 +4,7 @@ import * as chai from 'chai'
import { basename, dirname, isAbsolute, join, resolve } from 'path'
import * as request from 'supertest'
import * as WebTorrent from 'webtorrent'
import { ensureDir, pathExists, readFile } from 'fs-extra'
import { ensureDir, pathExists, readFile, stat } from 'fs-extra'
import * as ffmpeg from 'fluent-ffmpeg'

const expect = chai.expect
@@ -130,6 +130,12 @@ async function generateVideoWithFramerate (fps = 60) {
return tempFixturePath
}

async function getFileSize (path: string) {
const stats = await stat(path)

return stats.size
}

// ---------------------------------------------------------------------------

export {
@@ -138,6 +144,7 @@ export {
areHttpImportTestsDisabled,
buildServerDirectory,
webtorrentAdd,
getFileSize,
immutableAssign,
testImage,
buildAbsoluteFixturePath,


+ 8
- 1
shared/extra-utils/server/servers.ts View File

@@ -6,7 +6,7 @@ import { copy, pathExists, readdir, readFile, remove } from 'fs-extra'
import { join } from 'path'
import { randomInt } from '../../core-utils/miscs/miscs'
import { VideoChannel } from '../../models/videos'
import { root, wait } from '../miscs/miscs'
import { getFileSize, root, wait } from '../miscs/miscs'

interface ServerInfo {
app: ChildProcess
@@ -318,11 +318,18 @@ async function waitUntilLog (server: ServerInfo, str: string, count = 1, strictC
}
}

async function getServerFileSize (server: ServerInfo, subPath: string) {
const path = join(root(), 'test' + server.internalServerNumber, subPath)

return getFileSize(path)
}

// ---------------------------------------------------------------------------

export {
checkDirectoryIsEmpty,
checkTmpIsEmpty,
getServerFileSize,
ServerInfo,
parallelTests,
cleanupTests,


Loading…
Cancel
Save