aboutsummaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2023-05-05 10:53:04 +0200
committerChocobozzz <chocobozzz@cpy.re>2023-05-09 08:57:34 +0200
commite7d8e2b245491c0a8e008fb570037506d729ff04 (patch)
treed850a7f82cc02946f2e87b306d0b281cef5eb73d /server
parentdd3f99434cc3cb7226d33ffcd888c91d0ce150a9 (diff)
downloadPeerTube-e7d8e2b245491c0a8e008fb570037506d729ff04.tar.gz
PeerTube-e7d8e2b245491c0a8e008fb570037506d729ff04.tar.zst
PeerTube-e7d8e2b245491c0a8e008fb570037506d729ff04.zip
Fix audio transcoding copy
Diffstat (limited to 'server')
-rw-r--r--server/helpers/ffmpeg/ffmpeg-options.ts2
-rw-r--r--server/initializers/constants.ts2
-rw-r--r--server/lib/transcoding/transcoding-quick-transcode.ts51
-rw-r--r--server/tests/api/transcoding/transcoder.ts6
-rw-r--r--server/tests/helpers/core-utils.ts6
-rw-r--r--server/tests/peertube-runner/live-transcoding.ts2
-rw-r--r--server/tests/peertube-runner/studio-transcoding.ts2
-rw-r--r--server/tests/shared/generate.ts4
8 files changed, 13 insertions, 62 deletions
diff --git a/server/helpers/ffmpeg/ffmpeg-options.ts b/server/helpers/ffmpeg/ffmpeg-options.ts
index db6350d39..64d7c4179 100644
--- a/server/helpers/ffmpeg/ffmpeg-options.ts
+++ b/server/helpers/ffmpeg/ffmpeg-options.ts
@@ -11,7 +11,7 @@ export function getFFmpegCommandWrapperOptions (type: CommandType, availableEnco
11 availableEncoders, 11 availableEncoders,
12 profile: getProfile(type), 12 profile: getProfile(type),
13 13
14 niceness: FFMPEG_NICE[type], 14 niceness: FFMPEG_NICE[type.toUpperCase()],
15 tmpDirectory: CONFIG.STORAGE.TMP_DIR, 15 tmpDirectory: CONFIG.STORAGE.TMP_DIR,
16 threads: getThreads(type), 16 threads: getThreads(type),
17 17
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
index 6a757a0ff..adf24b73f 100644
--- a/server/initializers/constants.ts
+++ b/server/initializers/constants.ts
@@ -469,7 +469,7 @@ const VIDEO_RATE_TYPES: { [ id: string ]: VideoRateType } = {
469 DISLIKE: 'dislike' 469 DISLIKE: 'dislike'
470} 470}
471 471
472const FFMPEG_NICE: { [ id: string ]: number } = { 472const FFMPEG_NICE = {
473 // parent process defaults to niceness = 0 473 // parent process defaults to niceness = 0
474 // reminder: lower = higher priority, max value is 19, lowest is -20 474 // reminder: lower = higher priority, max value is 19, lowest is -20
475 LIVE: 5, // prioritize over VOD and THUMBNAIL 475 LIVE: 5, // prioritize over VOD and THUMBNAIL
diff --git a/server/lib/transcoding/transcoding-quick-transcode.ts b/server/lib/transcoding/transcoding-quick-transcode.ts
index b7f921890..53f12cd06 100644
--- a/server/lib/transcoding/transcoding-quick-transcode.ts
+++ b/server/lib/transcoding/transcoding-quick-transcode.ts
@@ -1,16 +1,6 @@
1import { FfprobeData } from 'fluent-ffmpeg' 1import { FfprobeData } from 'fluent-ffmpeg'
2import { CONFIG } from '@server/initializers/config' 2import { CONFIG } from '@server/initializers/config'
3import { VIDEO_TRANSCODING_FPS } from '@server/initializers/constants' 3import { canDoQuickAudioTranscode, canDoQuickVideoTranscode, ffprobePromise } from '@shared/ffmpeg'
4import { getMaxBitrate } from '@shared/core-utils'
5import {
6 ffprobePromise,
7 getAudioStream,
8 getMaxAudioBitrate,
9 getVideoStream,
10 getVideoStreamBitrate,
11 getVideoStreamDimensionsInfo,
12 getVideoStreamFPS
13} from '@shared/ffmpeg'
14 4
15export async function canDoQuickTranscode (path: string, existingProbe?: FfprobeData): Promise<boolean> { 5export async function canDoQuickTranscode (path: string, existingProbe?: FfprobeData): Promise<boolean> {
16 if (CONFIG.TRANSCODING.PROFILE !== 'default') return false 6 if (CONFIG.TRANSCODING.PROFILE !== 'default') return false
@@ -20,42 +10,3 @@ export async function canDoQuickTranscode (path: string, existingProbe?: Ffprobe
20 return await canDoQuickVideoTranscode(path, probe) && 10 return await canDoQuickVideoTranscode(path, probe) &&
21 await canDoQuickAudioTranscode(path, probe) 11 await canDoQuickAudioTranscode(path, probe)
22} 12}
23
24export async function canDoQuickAudioTranscode (path: string, probe?: FfprobeData): Promise<boolean> {
25 const parsedAudio = await getAudioStream(path, probe)
26
27 if (!parsedAudio.audioStream) return true
28
29 if (parsedAudio.audioStream['codec_name'] !== 'aac') return false
30
31 const audioBitrate = parsedAudio.bitrate
32 if (!audioBitrate) return false
33
34 const maxAudioBitrate = getMaxAudioBitrate('aac', audioBitrate)
35 if (maxAudioBitrate !== -1 && audioBitrate > maxAudioBitrate) return false
36
37 const channelLayout = parsedAudio.audioStream['channel_layout']
38 // Causes playback issues with Chrome
39 if (!channelLayout || channelLayout === 'unknown' || channelLayout === 'quad') return false
40
41 return true
42}
43
44export async function canDoQuickVideoTranscode (path: string, probe?: FfprobeData): Promise<boolean> {
45 const videoStream = await getVideoStream(path, probe)
46 const fps = await getVideoStreamFPS(path, probe)
47 const bitRate = await getVideoStreamBitrate(path, probe)
48 const resolutionData = await getVideoStreamDimensionsInfo(path, probe)
49
50 // If ffprobe did not manage to guess the bitrate
51 if (!bitRate) return false
52
53 // check video params
54 if (!videoStream) return false
55 if (videoStream['codec_name'] !== 'h264') return false
56 if (videoStream['pix_fmt'] !== 'yuv420p') return false
57 if (fps < VIDEO_TRANSCODING_FPS.MIN || fps > VIDEO_TRANSCODING_FPS.MAX) return false
58 if (bitRate > getMaxBitrate({ ...resolutionData, fps })) return false
59
60 return true
61}
diff --git a/server/tests/api/transcoding/transcoder.ts b/server/tests/api/transcoding/transcoder.ts
index fa78b58bb..8a0a7f6d2 100644
--- a/server/tests/api/transcoding/transcoder.ts
+++ b/server/tests/api/transcoding/transcoder.ts
@@ -3,7 +3,7 @@
3import { expect } from 'chai' 3import { expect } from 'chai'
4import { canDoQuickTranscode } from '@server/lib/transcoding/transcoding-quick-transcode' 4import { canDoQuickTranscode } from '@server/lib/transcoding/transcoding-quick-transcode'
5import { checkWebTorrentWorks, generateHighBitrateVideo, generateVideoWithFramerate } from '@server/tests/shared' 5import { checkWebTorrentWorks, generateHighBitrateVideo, generateVideoWithFramerate } from '@server/tests/shared'
6import { buildAbsoluteFixturePath, getAllFiles, getMaxBitrate, getMinLimitBitrate, omit } from '@shared/core-utils' 6import { buildAbsoluteFixturePath, getAllFiles, getMaxTheoreticalBitrate, getMinTheoreticalBitrate, omit } from '@shared/core-utils'
7import { 7import {
8 ffprobePromise, 8 ffprobePromise,
9 getAudioStream, 9 getAudioStream,
@@ -564,7 +564,7 @@ describe('Test video transcoding', function () {
564 564
565 expect(resolution).to.equal(resolution) 565 expect(resolution).to.equal(resolution)
566 566
567 const maxBitrate = getMaxBitrate({ ...dataResolution, fps }) 567 const maxBitrate = getMaxTheoreticalBitrate({ ...dataResolution, fps })
568 expect(bitrate).to.be.below(maxBitrate) 568 expect(bitrate).to.be.below(maxBitrate)
569 } 569 }
570 } 570 }
@@ -611,7 +611,7 @@ describe('Test video transcoding', function () {
611 const bitrate = await getVideoStreamBitrate(path) 611 const bitrate = await getVideoStreamBitrate(path)
612 612
613 const inputBitrate = 60_000 613 const inputBitrate = 60_000
614 const limit = getMinLimitBitrate({ fps: 10, ratio: 1, resolution: r }) 614 const limit = getMinTheoreticalBitrate({ fps: 10, ratio: 1, resolution: r })
615 let belowValue = Math.max(inputBitrate, limit) 615 let belowValue = Math.max(inputBitrate, limit)
616 belowValue += belowValue * 0.20 // Apply 20% margin because bitrate control is not very precise 616 belowValue += belowValue * 0.20 // Apply 20% margin because bitrate control is not very precise
617 617
diff --git a/server/tests/helpers/core-utils.ts b/server/tests/helpers/core-utils.ts
index de6ba4f82..cd2f07e4a 100644
--- a/server/tests/helpers/core-utils.ts
+++ b/server/tests/helpers/core-utils.ts
@@ -3,7 +3,7 @@
3import { expect } from 'chai' 3import { expect } from 'chai'
4import { snakeCase } from 'lodash' 4import { snakeCase } from 'lodash'
5import validator from 'validator' 5import validator from 'validator'
6import { getAverageBitrate, getMaxBitrate } from '@shared/core-utils' 6import { getAverageTheoreticalBitrate, getMaxTheoreticalBitrate } from '@shared/core-utils'
7import { VideoResolution } from '@shared/models' 7import { VideoResolution } from '@shared/models'
8import { objectConverter, parseBytes, parseDurationToMs } from '../../helpers/core-utils' 8import { objectConverter, parseBytes, parseDurationToMs } from '../../helpers/core-utils'
9 9
@@ -128,7 +128,7 @@ describe('Bitrate', function () {
128 ] 128 ]
129 129
130 for (const test of tests) { 130 for (const test of tests) {
131 expect(getMaxBitrate(test)).to.be.above(test.min * 1000).and.below(test.max * 1000) 131 expect(getMaxTheoreticalBitrate(test)).to.be.above(test.min * 1000).and.below(test.max * 1000)
132 } 132 }
133 }) 133 })
134 134
@@ -144,7 +144,7 @@ describe('Bitrate', function () {
144 ] 144 ]
145 145
146 for (const test of tests) { 146 for (const test of tests) {
147 expect(getAverageBitrate(test)).to.be.above(test.min * 1000).and.below(test.max * 1000) 147 expect(getAverageTheoreticalBitrate(test)).to.be.above(test.min * 1000).and.below(test.max * 1000)
148 } 148 }
149 }) 149 })
150}) 150})
diff --git a/server/tests/peertube-runner/live-transcoding.ts b/server/tests/peertube-runner/live-transcoding.ts
index 1e94eabcd..31716d545 100644
--- a/server/tests/peertube-runner/live-transcoding.ts
+++ b/server/tests/peertube-runner/live-transcoding.ts
@@ -145,7 +145,7 @@ describe('Test Live transcoding in peertube-runner program', function () {
145 const registrationToken = await servers[0].runnerRegistrationTokens.getFirstRegistrationToken() 145 const registrationToken = await servers[0].runnerRegistrationTokens.getFirstRegistrationToken()
146 146
147 peertubeRunner = new PeerTubeRunnerProcess() 147 peertubeRunner = new PeerTubeRunnerProcess()
148 await peertubeRunner.runServer({ hideLogs: false }) 148 await peertubeRunner.runServer()
149 await peertubeRunner.registerPeerTubeInstance({ server: servers[0], registrationToken, runnerName: 'runner' }) 149 await peertubeRunner.registerPeerTubeInstance({ server: servers[0], registrationToken, runnerName: 'runner' })
150 }) 150 })
151 151
diff --git a/server/tests/peertube-runner/studio-transcoding.ts b/server/tests/peertube-runner/studio-transcoding.ts
index cca905e2f..204836c4d 100644
--- a/server/tests/peertube-runner/studio-transcoding.ts
+++ b/server/tests/peertube-runner/studio-transcoding.ts
@@ -75,7 +75,7 @@ describe('Test studio transcoding in peertube-runner program', function () {
75 const registrationToken = await servers[0].runnerRegistrationTokens.getFirstRegistrationToken() 75 const registrationToken = await servers[0].runnerRegistrationTokens.getFirstRegistrationToken()
76 76
77 peertubeRunner = new PeerTubeRunnerProcess() 77 peertubeRunner = new PeerTubeRunnerProcess()
78 await peertubeRunner.runServer({ hideLogs: false }) 78 await peertubeRunner.runServer()
79 await peertubeRunner.registerPeerTubeInstance({ server: servers[0], registrationToken, runnerName: 'runner' }) 79 await peertubeRunner.registerPeerTubeInstance({ server: servers[0], registrationToken, runnerName: 'runner' })
80 }) 80 })
81 81
diff --git a/server/tests/shared/generate.ts b/server/tests/shared/generate.ts
index b0c8dba66..3788b049f 100644
--- a/server/tests/shared/generate.ts
+++ b/server/tests/shared/generate.ts
@@ -2,7 +2,7 @@ import { expect } from 'chai'
2import ffmpeg from 'fluent-ffmpeg' 2import ffmpeg from 'fluent-ffmpeg'
3import { ensureDir, pathExists } from 'fs-extra' 3import { ensureDir, pathExists } from 'fs-extra'
4import { dirname } from 'path' 4import { dirname } from 'path'
5import { buildAbsoluteFixturePath, getMaxBitrate } from '@shared/core-utils' 5import { buildAbsoluteFixturePath, getMaxTheoreticalBitrate } from '@shared/core-utils'
6import { getVideoStreamBitrate, getVideoStreamDimensionsInfo, getVideoStreamFPS } from '@shared/ffmpeg' 6import { getVideoStreamBitrate, getVideoStreamDimensionsInfo, getVideoStreamFPS } from '@shared/ffmpeg'
7 7
8async function ensureHasTooBigBitrate (fixturePath: string) { 8async function ensureHasTooBigBitrate (fixturePath: string) {
@@ -10,7 +10,7 @@ async function ensureHasTooBigBitrate (fixturePath: string) {
10 const dataResolution = await getVideoStreamDimensionsInfo(fixturePath) 10 const dataResolution = await getVideoStreamDimensionsInfo(fixturePath)
11 const fps = await getVideoStreamFPS(fixturePath) 11 const fps = await getVideoStreamFPS(fixturePath)
12 12
13 const maxBitrate = getMaxBitrate({ ...dataResolution, fps }) 13 const maxBitrate = getMaxTheoreticalBitrate({ ...dataResolution, fps })
14 expect(bitrate).to.be.above(maxBitrate) 14 expect(bitrate).to.be.above(maxBitrate)
15} 15}
16 16