mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2025-02-25 18:55:32 -06:00
Optimize transcoding profile building
This commit is contained in:
@@ -73,7 +73,7 @@ export class FFmpegCommandWrapper {
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
debugLog (msg: string, meta: any) {
|
||||
debugLog (msg: string, meta: any = {}) {
|
||||
this.logger.debug(msg, { ...meta, ...this.lTags })
|
||||
}
|
||||
|
||||
@@ -199,6 +199,7 @@ export class FFmpegCommandWrapper {
|
||||
'canCopyVideo',
|
||||
'resolution',
|
||||
'inputBitrate',
|
||||
'inputProbe',
|
||||
'fps',
|
||||
'inputRatio',
|
||||
'streamNum'
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import { FfprobeData } from 'fluent-ffmpeg'
|
||||
import { getAverageTheoreticalBitrate, getMaxTheoreticalBitrate, getMinTheoreticalBitrate } from '@peertube/peertube-core-utils'
|
||||
import {
|
||||
buildStreamSuffix,
|
||||
ffprobePromise,
|
||||
getAudioStream,
|
||||
getMaxAudioBitrate,
|
||||
getVideoStream,
|
||||
@@ -11,6 +9,7 @@ import {
|
||||
getVideoStreamFPS
|
||||
} from '@peertube/peertube-ffmpeg'
|
||||
import { EncoderOptionsBuilder, EncoderOptionsBuilderParams } from '@peertube/peertube-models'
|
||||
import { FfprobeData } from 'fluent-ffmpeg'
|
||||
|
||||
const defaultX264VODOptionsBuilder: EncoderOptionsBuilder = (options: EncoderOptionsBuilderParams) => {
|
||||
const { fps, inputRatio, inputBitrate, resolution } = options
|
||||
@@ -41,14 +40,12 @@ const defaultX264LiveOptionsBuilder: EncoderOptionsBuilder = (options: EncoderOp
|
||||
}
|
||||
}
|
||||
|
||||
const defaultAACOptionsBuilder: EncoderOptionsBuilder = async ({ input, streamNum, canCopyAudio }) => {
|
||||
const probe = await ffprobePromise(input)
|
||||
|
||||
if (canCopyAudio && await canDoQuickAudioTranscode(input, probe)) {
|
||||
const defaultAACOptionsBuilder: EncoderOptionsBuilder = async ({ input, streamNum, canCopyAudio, inputProbe }) => {
|
||||
if (canCopyAudio && await canDoQuickAudioTranscode(input, inputProbe)) {
|
||||
return { copy: true, outputOptions: [ ] }
|
||||
}
|
||||
|
||||
const parsedAudio = await getAudioStream(input, probe)
|
||||
const parsedAudio = await getAudioStream(input, inputProbe)
|
||||
|
||||
// We try to reduce the ceiling bitrate by making rough matches of bitrates
|
||||
// Of course this is far from perfect, but it might save some space in the end
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { FilterSpecification } from 'fluent-ffmpeg'
|
||||
import { join } from 'path'
|
||||
import { pick } from '@peertube/peertube-core-utils'
|
||||
import { FfprobeData, FilterSpecification } from 'fluent-ffmpeg'
|
||||
import { join } from 'path'
|
||||
import { FFmpegCommandWrapper, FFmpegCommandWrapperOptions } from './ffmpeg-command-wrapper.js'
|
||||
import { buildStreamSuffix, getScaleFilter, StreamType } from './ffmpeg-utils.js'
|
||||
import { StreamType, buildStreamSuffix, getScaleFilter } from './ffmpeg-utils.js'
|
||||
import { addDefaultEncoderGlobalParams, addDefaultEncoderParams, applyEncoderOptions } from './shared/index.js'
|
||||
|
||||
export class FFmpegLive {
|
||||
@@ -27,6 +27,7 @@ export class FFmpegLive {
|
||||
bitrate: number
|
||||
ratio: number
|
||||
hasAudio: boolean
|
||||
probe: FfprobeData
|
||||
|
||||
segmentListSize: number
|
||||
segmentDuration: number
|
||||
@@ -38,7 +39,8 @@ export class FFmpegLive {
|
||||
bitrate,
|
||||
masterPlaylistName,
|
||||
ratio,
|
||||
hasAudio
|
||||
hasAudio,
|
||||
probe
|
||||
} = options
|
||||
const command = this.commandWrapper.buildCommand(inputUrl)
|
||||
|
||||
@@ -69,6 +71,7 @@ export class FFmpegLive {
|
||||
|
||||
inputBitrate: bitrate,
|
||||
inputRatio: ratio,
|
||||
inputProbe: probe,
|
||||
|
||||
resolution,
|
||||
fps,
|
||||
@@ -79,6 +82,7 @@ export class FFmpegLive {
|
||||
|
||||
{
|
||||
const streamType: StreamType = 'video'
|
||||
|
||||
const builderResult = await this.commandWrapper.getEncoderBuilderResult({ ...baseEncoderBuilderParams, streamType })
|
||||
if (!builderResult) {
|
||||
throw new Error('No available live video encoder found')
|
||||
@@ -108,6 +112,7 @@ export class FFmpegLive {
|
||||
|
||||
if (hasAudio) {
|
||||
const streamType: StreamType = 'audio'
|
||||
|
||||
const builderResult = await this.commandWrapper.getEncoderBuilderResult({ ...baseEncoderBuilderParams, streamType })
|
||||
if (!builderResult) {
|
||||
throw new Error('No available live audio encoder found')
|
||||
|
||||
@@ -45,6 +45,7 @@ export async function presetVOD (options: {
|
||||
input,
|
||||
inputBitrate: bitrate,
|
||||
inputRatio: videoStreamDimensions?.ratio || 0,
|
||||
inputProbe: probe,
|
||||
|
||||
resolution,
|
||||
fps,
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
// Types used by plugins and ffmpeg-utils
|
||||
|
||||
import { FfprobeData } from 'fluent-ffmpeg'
|
||||
|
||||
export type EncoderOptionsBuilderParams = {
|
||||
input: string
|
||||
|
||||
@@ -14,6 +16,7 @@ export type EncoderOptionsBuilderParams = {
|
||||
// Could be undefined if we could not get input bitrate (some RTMP streams for example)
|
||||
inputBitrate: number
|
||||
inputRatio: number
|
||||
inputProbe: FfprobeData
|
||||
|
||||
// For lives
|
||||
streamNum?: number
|
||||
|
||||
Reference in New Issue
Block a user