Do not transcode to an higher bitrate
Thanks bkil https://github.com/bkil
This commit is contained in:
parent
da2516fde1
commit
d218e7de94
5 changed files with 59 additions and 3 deletions
|
@ -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.
|
||||
|
|
|
@ -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
vendored
Normal file
BIN
server/tests/fixtures/low-bitrate.mp4
vendored
Normal file
Binary file not shown.
|
@ -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,
|
||||
|
|
|
@ -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…
Reference in a new issue