diff --git a/.travis.yml b/.travis.yml index 9fd54447c..7670cb7c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,10 @@ addons: - g++-4.9 postgresql: "9.4" -cache: yarn +cache: + directories: + - $HOME/.cache/yarn + - $HOME/fixtures sudo: false diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index ec554ed19..0ce5197ea 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts @@ -4,8 +4,8 @@ import * as chai from 'chai' import 'mocha' import { omit } from 'lodash' import * as ffmpeg from 'fluent-ffmpeg' -import { VideoDetails, VideoState, getMaxBitrate, VideoResolution } from '../../../../shared/models/videos' -import { getVideoFileFPS, audio, getVideoFileBitrate, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' +import { getMaxBitrate, VideoDetails, VideoResolution, VideoState } from '../../../../shared/models/videos' +import { audio, getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' import { buildAbsoluteFixturePath, doubleFollow, @@ -20,9 +20,9 @@ import { uploadVideo, webtorrentAdd } from '../../utils' -import { join, basename } from 'path' +import { join } from 'path' import { waitJobs } from '../../utils/server/jobs' -import { remove } from 'fs-extra' +import { pathExists } from 'fs-extra' import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants' const expect = chai.expect @@ -283,59 +283,62 @@ describe('Test video transcoding', function () { } }) - const tempFixturePath = buildAbsoluteFixturePath('video_high_bitrate_1080p.mp4') + const tempFixturePath = buildAbsoluteFixturePath('video_high_bitrate_1080p.mp4', true) it('Should respect maximum bitrate values', async function () { this.timeout(160000) { - // Generate a random, high bitrate video on the fly, so we don't have to include - // a large file in the repo. The video needs to have a certain minimum length so - // that FFmpeg properly applies bitrate limits. - // https://stackoverflow.com/a/15795112 - await new Promise(async (res, rej) => { - ffmpeg() - .outputOptions(['-f rawvideo', '-video_size 1920x1080', '-i /dev/urandom']) - .outputOptions(['-ac 2', '-f s16le', '-i /dev/urandom', '-t 10']) - .outputOptions(['-maxrate 10M', '-bufsize 10M']) - .output(tempFixturePath) - .on('error', rej) - .on('end', res) - .run() - }) + const exists = await pathExists(tempFixturePath) + if (!exists) { + + // Generate a random, high bitrate video on the fly, so we don't have to include + // a large file in the repo. The video needs to have a certain minimum length so + // that FFmpeg properly applies bitrate limits. + // https://stackoverflow.com/a/15795112 + await new Promise(async (res, rej) => { + ffmpeg() + .outputOptions([ '-f rawvideo', '-video_size 1920x1080', '-i /dev/urandom' ]) + .outputOptions([ '-ac 2', '-f s16le', '-i /dev/urandom', '-t 10' ]) + .outputOptions([ '-maxrate 10M', '-bufsize 10M' ]) + .output(tempFixturePath) + .on('error', rej) + .on('end', res) + .run() + }) + } const bitrate = await getVideoFileBitrate(tempFixturePath) expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 60, VIDEO_TRANSCODING_FPS)) + } - const videoAttributes = { - name: 'high bitrate video', - description: 'high bitrate video', - fixture: basename(tempFixturePath) - } + const videoAttributes = { + name: 'high bitrate video', + description: 'high bitrate video', + fixture: tempFixturePath + } - await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes) + await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes) - await waitJobs(servers) + await waitJobs(servers) - for (const server of servers) { - const res = await getVideosList(server.url) + for (const server of servers) { + 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) - for (const resolution of ['240', '360', '480', '720', '1080']) { - const path = join(root(), 'test2', 'videos', video.uuid + '-' + resolution + '.mp4') - const bitrate = await getVideoFileBitrate(path) - const fps = await getVideoFileFPS(path) - const resolution2 = await getVideoFileResolution(path) + for (const resolution of ['240', '360', '480', '720', '1080']) { + const path = join(root(), 'test2', 'videos', video.uuid + '-' + resolution + '.mp4') + const bitrate = await getVideoFileBitrate(path) + const fps = await getVideoFileFPS(path) + const resolution2 = await getVideoFileResolution(path) - expect(resolution2.videoFileResolution.toString()).to.equal(resolution) - expect(bitrate).to.be.below(getMaxBitrate(resolution2.videoFileResolution, fps, VIDEO_TRANSCODING_FPS)) - } + expect(resolution2.videoFileResolution.toString()).to.equal(resolution) + expect(bitrate).to.be.below(getMaxBitrate(resolution2.videoFileResolution, fps, VIDEO_TRANSCODING_FPS)) } } }) after(async function () { - remove(tempFixturePath) killallServers(servers) }) }) diff --git a/server/tests/utils/miscs/miscs.ts b/server/tests/utils/miscs/miscs.ts index b2f80e9b1..d20fa96b8 100644 --- a/server/tests/utils/miscs/miscs.ts +++ b/server/tests/utils/miscs/miscs.ts @@ -51,11 +51,13 @@ async function testImage (url: string, imageName: string, imagePath: string, ext expect(data.length).to.be.below(maxLength) } -function buildAbsoluteFixturePath (path: string) { +function buildAbsoluteFixturePath (path: string, customTravisPath = false) { if (isAbsolute(path)) { return path } + if (customTravisPath && process.env.TRAVIS) return join(process.env.HOME, 'fixtures', path) + return join(__dirname, '..', '..', 'fixtures', path) } diff --git a/shared/models/videos/video-resolution.enum.ts b/shared/models/videos/video-resolution.enum.ts index 3c52bbf98..e40e5b58b 100644 --- a/shared/models/videos/video-resolution.enum.ts +++ b/shared/models/videos/video-resolution.enum.ts @@ -34,22 +34,22 @@ export function getTargetBitrate (resolution: VideoResolution, fps: number, // quality according to Google Live Encoder: 2,250 - 6,000 Kbps // Quality according to YouTube Video Info: 2634 Kbps return 2600 * 1000 - } else { - // quality according to Google Live Encoder: 1,500 - 4,000 Kbps - // Quality according to YouTube Video Info: 1752 Kbps - return 1750 * 1000 } + + // quality according to Google Live Encoder: 1,500 - 4,000 Kbps + // Quality according to YouTube Video Info: 1752 Kbps + return 1750 * 1000 case VideoResolution.H_1080P: // fallthrough default: if (fps === fpsTranscodingConstants.MAX) { // quality according to Google Live Encoder: 3000 - 6000 Kbps // Quality according to YouTube Video Info: 4387 Kbps return 4400 * 1000 - } else { - // quality according to Google Live Encoder: 3000 - 6000 Kbps - // Quality according to YouTube Video Info: 3277 Kbps - return 3300 * 1000 } + + // quality according to Google Live Encoder: 3000 - 6000 Kbps + // Quality according to YouTube Video Info: 3277 Kbps + return 3300 * 1000 } }