nextcloud / viewer

🖼 Simple file viewer with slideshow for media
GNU Affero General Public License v3.0
99 stars 54 forks source link

Make it possible to play unsupported video codecs #1207

Open szaimen opened 2 years ago

szaimen commented 2 years ago

Is your feature request related to a problem? Please describe. Some video containers are not supported by webbrowsers and probably will not be in the near future.

Describe the solution you'd like Find a solution that makes it possible to play almost all video containers in browsers. One solution would be using wasm and ffmpwg to transcode videos on the fly directly in the browser. See e.g. this article: https://blog.scottlogic.com/2020/11/23/ffmpeg-webassembly.html#:~:text=creating%20a%20streaming%20transcoder

Describe alternatives you've considered Not doing this?

Additional context Add any other context or screenshots about the feature request here.

labor4 commented 1 year ago

I see what you mean ;-)

A word of caution though. Ffmpeg as a child of a php thread is probably a limited experience, prone to hanging the whole system. Even rewrapping could be too much.

My first thought appart from this, was to offload the task to a mature standalone server, also capable of using GPUs, and providing an IN/OUT API for nextcloud. The vast amount of combinations in containers and codecs regarding web delivery also seems to me a very standalone project idea.

szaimen commented 1 year ago

I think the memories app has the pssibility to transcode videos on the fly. So maybe we could have a look at the app how they are doing it which sounds like the best approach to me.

labor4 commented 1 year ago

IIRC ffmpeg as a subprocess of php would limit to 1 thread. Encoding ProRes to h264 can easily eat 500% cpu on 2.2Ghz. That's why I recommend ffmpeg to be an instance that is independent and can take care of itself.

szaimen commented 1 year ago

The memories app features on-the-fly transcoding now

skjnldsv commented 1 year ago

The memories app features on-the-fly transcoding now

Done via php and ffmpeg btw https://github.com/pulsejet/memories/wiki/Configuration

szaimen commented 1 year ago

Done via php and ffmpeg btw https://github.com/pulsejet/memories/wiki/Configuration

No, the transcoder is written in go IIRC: https://github.com/pulsejet/go-vod

ohthehugemanatee commented 1 year ago

IMO this is about much more than supporting other video formats. Note that modern cameraphones don't encode their videos with HLS for streaming, and can produce very large files. Here are some of the other reasons I have in mind:

Recommend:

  1. changing the Issue title to "Implement transcoding to playback video on variety of devices, bandwidths, and file formats"
  2. making it easier for 3p apps to replace parts of the interface for video/photo viewing, so e.g. memories doesn't need to implement it's own whole modal window to get their improvements to the video experience... they can just replace part of Viewer's video modal interface and use that.
labor4 commented 1 year ago

for reference i recommend to also open the research looking at bigger scale applications:

I think this could be something to burn our fingers on. It may be worthwhile to check on an external encoder. Maybe something smaller, a docker instance even. I think at some point the problems that video online delivery holds, should be contained in a separate instance.

I found multiple projects at first glance, but not the promising one right away, i earlier found trustworthy and mature, Sorry. Mistserver doesn't do GPU, so i would not recommend it as a sole solution (i deliver preencoded multichannel mpeg_ts to mistserver, but thats streaming not VOD)

My remarks seem overkill, but if there are fitting solutions out there, this may well overlap with the desire for NC to be a video delivery platform, which for files it already is.

best wishes m

ohthehugemanatee commented 1 year ago

That's actually how Memories does it - the app downloads go-vod at runtime. In settings you can choose to use an external go-vod over HTTP, specifically so you can separate hardware requirements as necessary.

While I agree that there are lots of potential solutions to investigate, given that there's already a Nextcloud-based implementation that offers the all the desired capabilities using Vue, we should focus on leveraging that work. I also created a ticket on Memories to add the option to override the video/photo viewers globally.

ohthehugemanatee commented 1 year ago

related #330 nextcloud/server#39560 and nextcloud/server#19567