如何基于每个请求有效地处理视频?

时间:2015-12-17 23:46:37

标签: video ffmpeg video-streaming html5-video

我正在开发一个Web应用程序,在该应用程序中,必须先将水印应用于视频,然后再将其发送给用户。目前,此水印是静态的,并且在更新视频时使用ffmpeg创建。但是,应用程序正在发生变化,因此每次为视频发出的请求都会在视频中添加唯一的水印。这可以防止出现问题,因为视频文件可能相当大并且添加水印可能是耗时的(例如,在某些情况下,添加水印可能需要一分钟以上),但是在上载时不能添加水印。 / p>

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

  1. RTMP解决方案不合适,因为它们似乎需要Flash。必须在完全不支持Flash的设备上支持此应用程序,或者不安装(也不会)安装它。
  2. 我考虑过使用MPEG-DASH,但只能获得有限的支持。也就是说,应用程序所针对的Firefox版本不支持它,iOS或某些版本的Safari也不支持它。
  3. 我考虑过HLS,但它比MPEG-DASH享受更有限的支持。
  4. 无论如何,我实际上无法让Dash.js(MPEG-DASH流的参考播放器)工作,虽然这可能是由于编码问题,但我不确定。
  5. 我想知道这个问题是否有更好的(也许是更简单的)解决方案;也许流媒体视频根本不是可行的方式? 是否有一种有效的方式来动态转码视频文件并开始快速将其发送到浏览器?

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

2 个答案:

答案 0 :(得分:1)

  1. 你对HLS的支持有限是错误的。它得到了现代移动设备的广泛支持,iOS(自Apple创建协议)和Android(在早期的4.x版本中存在一些错误,但从4.4开始它可以正常工作)。请参阅encoding.com&#39; 2015 Global Media Delivery Report

    仅在桌面上需要Flash后备,但MacOS上的Safari除外。支持和免费的HLS播放器都可以在桌面上使用Flash后备支持。

  2. Nginx RTMP模块还可以根据输入RTMP流输出HLS。您只需使用H.264为模块提供RTMP流,然后在HLS中为您重新复用它。

    使用ffmpeg(来自docs)的示例:

     ffmpeg -loglevel verbose -re -i movie.avi  -vcodec libx264
            -vprofile baseline -acodec libmp3lame -ar 44100 -ac 1
            -f flv rtmp://localhost:1935/hls/movie
    

    Nginx配置:

    application hls {
        live on;
        hls on;
        hls_path /tmp/hls;
    }
    

    公开播放网址为http://<server>/hls/movie/playlist.m3u8。您还可以根据要求使用exec启动ffmpeg命令(带水印叠加层)。

答案 1 :(得分:1)

这是我见过一些网站实施的解决方案:

  1. 向DOM添加canvas,否则将放置video element
  2. 创建视频元素并将其渲染到画布
  3. 在画布上呈现的视频顶部渲染水印图像
  4. 优点:

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

    缺点:

    • HTML5具体。像IE 7,8这样的老浏览器大多数都无法使用。无论如何,这些浏览器都需要Flash。
    • 需要来自客户端浏览器的更多处理能力。对于桌面浏览器而言,这不是问题,但可能会导致旧的功率不足的手机播放不稳定和/或电池消耗量增加。
    • 如果有人直接播放媒体流(不使用您的网页,例如在VLC中),则不会有徽标。