diff options
author | frankdelange <yetangitu-f@unternet.org> | 2019-11-01 02:06:19 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2019-11-25 10:59:47 +0100 |
commit | 5c7d650827cc471a03e7fa18362bcbcbe5d30838 (patch) | |
tree | 41c96e3c9e2dcd4f15166e4f13b427ef116ea4f1 /server/lib/video-transcoding.ts | |
parent | dee6fe1e4f5c024fd387e8c2b306c174b24aa8b3 (diff) | |
download | PeerTube-5c7d650827cc471a03e7fa18362bcbcbe5d30838.tar.gz PeerTube-5c7d650827cc471a03e7fa18362bcbcbe5d30838.tar.zst PeerTube-5c7d650827cc471a03e7fa18362bcbcbe5d30838.zip |
Add audio-only option to transcoders and player
This patch adds an audio-only option to PeerTube by means of a new transcoding configuration which creates mp4 files which only contain an audio stream. This new transcoder has a resolution of '0' and is presented in the preferences and in the player resolution menu as 'Audio-only' (localised). When playing such streams the player shows the file thumbnail as background and disables controls autohide.
Audio-only files can be shared and streamed just like any other file. They can be downloaded as well, the resulting file will be an mp4 container with a single audio stream.
This patch is a proof of concept to show the feasibility of 'true' audio-only support. There are better ways of doing this which also enable multiple audio streams for a given video stream (e.g. DASH) but as this would entail a fundamental change in the way PeerTube works it is a bridge too far for a simple proof of concept.
Diffstat (limited to 'server/lib/video-transcoding.ts')
-rw-r--r-- | server/lib/video-transcoding.ts | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/server/lib/video-transcoding.ts b/server/lib/video-transcoding.ts index 9243d1742..9dd54837f 100644 --- a/server/lib/video-transcoding.ts +++ b/server/lib/video-transcoding.ts | |||
@@ -81,12 +81,52 @@ async function transcodeNewResolution (video: MVideoWithFile, resolution: VideoR | |||
81 | const videoOutputPath = getVideoFilePath(video, newVideoFile) | 81 | const videoOutputPath = getVideoFilePath(video, newVideoFile) |
82 | const videoTranscodedPath = join(transcodeDirectory, getVideoFilename(video, newVideoFile)) | 82 | const videoTranscodedPath = join(transcodeDirectory, getVideoFilename(video, newVideoFile)) |
83 | 83 | ||
84 | const transcodeOptions = resolution === VideoResolution.H_NOVIDEO | ||
85 | ? { | ||
86 | type: 'split-audio' as 'split-audio', | ||
87 | inputPath: videoInputPath, | ||
88 | outputPath: videoTranscodedPath, | ||
89 | resolution, | ||
90 | } | ||
91 | : { | ||
92 | type: 'video' as 'video', | ||
93 | inputPath: videoInputPath, | ||
94 | outputPath: videoTranscodedPath, | ||
95 | resolution, | ||
96 | isPortraitMode: isPortrait | ||
97 | } | ||
98 | |||
99 | await transcode(transcodeOptions) | ||
100 | |||
101 | return onVideoFileTranscoding(video, newVideoFile, videoTranscodedPath, videoOutputPath) | ||
102 | } | ||
103 | |||
104 | /** | ||
105 | * Extract audio into a separate audio-only mp4. | ||
106 | */ | ||
107 | async function splitAudioFile (video: MVideoWithFile) { | ||
108 | const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR | ||
109 | const transcodeDirectory = CONFIG.STORAGE.TMP_DIR | ||
110 | const extname = '.mp4' | ||
111 | const resolution = VideoResolution.H_NOVIDEO | ||
112 | |||
113 | // We are sure it's x264 in mp4 because optimizeOriginalVideofile was already executed | ||
114 | const videoInputPath = join(videosDirectory, video.getVideoFilename(video.getOriginalFile())) | ||
115 | |||
116 | const newVideoFile = new VideoFileModel({ | ||
117 | resolution, | ||
118 | extname, | ||
119 | size: 0, | ||
120 | videoId: video.id | ||
121 | }) | ||
122 | const videoOutputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(newVideoFile)) | ||
123 | const videoTranscodedPath = join(transcodeDirectory, video.getVideoFilename(newVideoFile)) | ||
124 | |||
84 | const transcodeOptions = { | 125 | const transcodeOptions = { |
85 | type: 'video' as 'video', | 126 | type: 'split-audio' as 'split-audio', |
86 | inputPath: videoInputPath, | 127 | inputPath: videoInputPath, |
87 | outputPath: videoTranscodedPath, | 128 | outputPath: videoTranscodedPath, |
88 | resolution, | 129 | resolution |
89 | isPortraitMode: isPortrait | ||
90 | } | 130 | } |
91 | 131 | ||
92 | await transcode(transcodeOptions) | 132 | await transcode(transcodeOptions) |