Video 如何根据每个请求有效地处理视频?

Video 如何根据每个请求有效地处理视频?,video,ffmpeg,video-streaming,html5-video,Video,Ffmpeg,Video Streaming,Html5 Video,我正在开发一个web应用程序,在将视频发送给用户之前,必须将水印应用于视频。当前,此水印是静态的,在更新视频时使用ffmpeg创建。但是,应用程序正在更改,以便为视频的每个请求添加唯一的水印。这可以防止出现问题,因为视频文件可能相当大,添加水印可能非常耗时(例如,在某些情况下,添加水印可能需要一分钟以上),但无法在上传时添加水印 我认为流媒体视频可能是一个解决方案,并使用nginx rtmp模块实现了一个解决方案,但出现了几个问题: RTMP解决方案是不可行的,因为它们似乎需要闪存。此应用程序必

我正在开发一个web应用程序,在将视频发送给用户之前,必须将水印应用于视频。当前,此水印是静态的,在更新视频时使用ffmpeg创建。但是,应用程序正在更改,以便为视频的每个请求添加唯一的水印。这可以防止出现问题,因为视频文件可能相当大,添加水印可能非常耗时(例如,在某些情况下,添加水印可能需要一分钟以上),但无法在上传时添加水印

我认为流媒体视频可能是一个解决方案,并使用nginx rtmp模块实现了一个解决方案,但出现了几个问题:

  • RTMP解决方案是不可行的,因为它们似乎需要闪存。此应用程序必须在完全不支持闪存的设备上受支持,或者在没有(也不会)安装闪存的设备上受支持
  • 我曾考虑过使用MPEG-DASH,但支持有限。也就是说,应用程序针对的Firefox版本不支持它,iOS或某些版本的Safari也不支持它
  • 我考虑过HLS,但它的支持比MPEG-DASH更为有限
  • 不管怎样,我实际上还没有能够让Dash.js(MPEG-Dash流的参考播放器)工作,尽管这可能是由于编码问题,我不确定
  • 我想知道是否有更好(也许更简单)的办法来解决这个问题;也许流媒体视频根本就不是一种方式有没有一种有效的方法可以在运行中对视频文件进行转码并快速将其发送到浏览器?

    我不反对使用node.js或其他平台/框架等解决方案,如果需要,解决方案可以使用HTML5

  • 您对HLS支持有限的看法是错误的。它在现代移动设备上得到了广泛的支持,包括iOS(自苹果创建该协议以来)和Android(在一些早期的4.x版本上确实存在一些bug,但从4.4开始就可以正常工作)。请参阅encoding.com的

    只有在台式机上,您才需要闪存备份,MacOS上的Safari除外。在台式机上提供带闪存后备支持的付费和免费HLS播放器

  • Nginx RTMP模块还可以基于输入RTMP流输出HLS。您只需使用H.264向模块提供一个RTMP流,它就可以在HLS中为您重新多路复用

    使用
    ffmpeg
    的示例(来自):

    Nginx配置:

    application hls {
        live on;
        hls on;
        hls_path /tmp/hls;
    }
    
    公共播放URL将为
    http:///hls/movie/playlist.m3u8
    。您还可以使用
    exec
    根据请求启动
    ffmpeg
    命令(带水印覆盖)


  • 以下是一些网站实施的解决方案:

  • 将a添加到DOM中,否则将在其中放置a
  • 创建视频元素并将其渲染到画布
  • 在画布中渲染视频的顶部渲染水印图像
  • 优点:

    • 相对容易实现。不需要服务器端配置或ffmpeg或nginx插件
    • 所有的工作都是在客户端完成的,因此您可以减少服务器负载
    • 你可以放任何你喜欢的水印。您甚至可以设置动画或在3D中渲染(使用webgl)
    缺点:

    • HTML5特有的。像IE7、IE8这样的旧浏览器大多数都不起作用。无论如何,这些浏览器都需要Flash
    • 需要客户端浏览器提供更多的处理能力。这对于桌面浏览器来说不是问题,但可能会导致播放不稳定和/或在旧款、电量不足的手机上消耗更高的电池
    • 如果有人直接播放媒体流(不使用您的网页,例如在VLC中),则将没有徽标

    您甚至不再需要Flash在台式机上播放HLS。你可以使用player-like,and(这个是免费的开源的)。从你给出的代码片段中,我看不出水印应该去哪里。
    ffmpeg
    命令对输入视频进行转码并输出rtmp流。Nginx配置获取rtmp流并将其重新加载到hls。我看不到水印?我遗漏了什么吗?我不熟悉这些播放器,看看它们是否在没有第三方解码器的情况下工作。覆盖在ffmpeg ofc命令中,您可以使用nginx exec按需启动它。我有Viblast和Theo的经验,它们是完整的HTML5解决方案,不需要任何特定的第三方解码器或插件。他们使用内置API来实现HLS回放。代码段中的
    ffmpeg
    命令对输入流进行转码(
    -vcodec libx264
    将进行ffmpeg转码,即使输入已经是h264)。示例来自nginx文档。您将使用自己的命令。如果你覆盖一个水印,你将被迫重新编码。实际上我现在正在这样做,但我希望水印能真正嵌入到视频中。好主意!
    application hls {
        live on;
        hls on;
        hls_path /tmp/hls;
    }