aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib
diff options
context:
space:
mode:
authorfrankdelange <yetangitu-f@unternet.org>2019-11-01 02:06:19 +0100
committerChocobozzz <me@florianbigard.com>2019-11-25 10:59:47 +0100
commit5c7d650827cc471a03e7fa18362bcbcbe5d30838 (patch)
tree41c96e3c9e2dcd4f15166e4f13b427ef116ea4f1 /server/lib
parentdee6fe1e4f5c024fd387e8c2b306c174b24aa8b3 (diff)
downloadPeerTube-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')
-rw-r--r--server/lib/video-transcoding.ts46
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 */
107async 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)