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 /client/src | |
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 'client/src')
3 files changed, 18 insertions, 4 deletions
diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts index 8411c4f4f..5f23c80a2 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts +++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts | |||
@@ -36,6 +36,10 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit { | |||
36 | super() | 36 | super() |
37 | 37 | ||
38 | this.resolutions = [ | 38 | this.resolutions = [ |
39 | { | ||
40 | id: '0p', | ||
41 | label: this.i18n('Audio-only') | ||
42 | }, | ||
39 | { | 43 | { |
40 | id: '240p', | 44 | id: '240p', |
41 | label: this.i18n('240p') | 45 | label: this.i18n('240p') |
diff --git a/client/src/assets/player/videojs-components/resolution-menu-button.ts b/client/src/assets/player/videojs-components/resolution-menu-button.ts index aeb48888f..445b14b2b 100644 --- a/client/src/assets/player/videojs-components/resolution-menu-button.ts +++ b/client/src/assets/player/videojs-components/resolution-menu-button.ts | |||
@@ -79,7 +79,7 @@ class ResolutionMenuButton extends MenuButton { | |||
79 | this.player_, | 79 | this.player_, |
80 | { | 80 | { |
81 | id: d.id, | 81 | id: d.id, |
82 | label: d.label, | 82 | label: d.id == 0 ? this.player .localize('Audio-only') : d.label, |
83 | selected: d.selected, | 83 | selected: d.selected, |
84 | callback: data.qualitySwitchCallback | 84 | callback: data.qualitySwitchCallback |
85 | }) | 85 | }) |
diff --git a/client/src/assets/player/webtorrent/webtorrent-plugin.ts b/client/src/assets/player/webtorrent/webtorrent-plugin.ts index 4a0b38703..007fc58cc 100644 --- a/client/src/assets/player/webtorrent/webtorrent-plugin.ts +++ b/client/src/assets/player/webtorrent/webtorrent-plugin.ts | |||
@@ -181,20 +181,29 @@ class WebTorrentPlugin extends Plugin { | |||
181 | const currentTime = this.player.currentTime() | 181 | const currentTime = this.player.currentTime() |
182 | const isPaused = this.player.paused() | 182 | const isPaused = this.player.paused() |
183 | 183 | ||
184 | // Remove poster to have black background | ||
185 | this.playerElement.poster = '' | ||
186 | |||
187 | // Hide bigPlayButton | 184 | // Hide bigPlayButton |
188 | if (!isPaused) { | 185 | if (!isPaused) { |
189 | this.player.bigPlayButton.hide() | 186 | this.player.bigPlayButton.hide() |
190 | } | 187 | } |
191 | 188 | ||
189 | // Audio-only (resolutionId == 0) gets special treatment | ||
190 | if (resolutionId > 0) { | ||
191 | // Hide poster to have black background | ||
192 | this.player.removeClass('vjs-playing-audio-only-content') | ||
193 | this.player.posterImage.hide() | ||
194 | } else { | ||
195 | // Audio-only: show poster, do not auto-hide controls | ||
196 | this.player.addClass('vjs-playing-audio-only-content') | ||
197 | this.player.posterImage.show() | ||
198 | } | ||
199 | |||
192 | const newVideoFile = this.videoFiles.find(f => f.resolution.id === resolutionId) | 200 | const newVideoFile = this.videoFiles.find(f => f.resolution.id === resolutionId) |
193 | const options = { | 201 | const options = { |
194 | forcePlay: false, | 202 | forcePlay: false, |
195 | delay, | 203 | delay, |
196 | seek: currentTime + (delay / 1000) | 204 | seek: currentTime + (delay / 1000) |
197 | } | 205 | } |
206 | |||
198 | this.updateVideoFile(newVideoFile, options) | 207 | this.updateVideoFile(newVideoFile, options) |
199 | } | 208 | } |
200 | 209 | ||
@@ -327,6 +336,7 @@ class WebTorrentPlugin extends Plugin { | |||
327 | this.player.posterImage.show() | 336 | this.player.posterImage.show() |
328 | this.player.removeClass('vjs-has-autoplay') | 337 | this.player.removeClass('vjs-has-autoplay') |
329 | this.player.removeClass('vjs-has-big-play-button-clicked') | 338 | this.player.removeClass('vjs-has-big-play-button-clicked') |
339 | this.player.removeClass('vjs-playing-audio-only-content') | ||
330 | 340 | ||
331 | return done() | 341 | return done() |
332 | }) | 342 | }) |