使用 JW Player 播放RTMP 流

2024-03-25 21:18
文章标签 使用 播放 player rtmp jw

本文主要是介绍使用 JW Player 播放RTMP 流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   译序:JW Media Player 是开源的网页使用的 Flash 播放器。本文采摘于 JW Player 的官方文档,讲解了 JW Player 对于 RTMP 的使用方法,我们可以从 JW Player 客户端的角度来了解 RTMP 协议。以下是官方原文:

 

         简介
        RTMP ( Real Time Messaging Protocol 实时消息传输协议 ) 是一个用于将点播和直播媒体交付给 Adobe Flash 应用 (比如 JW Player) 的体系。RTMP 支持 MP4 和 FLV 视频,AAC 和 MP3 音频。RTMP 相对于一般的 HTTP 视频下载 (很多网站使用这种方式进行在线视频播放) 具有以下优势:
  • RTMP 可以进行视频直播,人们可以在你录制的同时观看视频。
  • RTMP 可以做动态流,播放视频的质量可以根据带宽而自动变化。
  • 播放器可以快进到视频的后面部分,这对于大于十分钟的视频很有用 (这一点是 HTTP 下载方式的在线视频无法匹敌的)。
  • 播放器维护有一个小小的缓冲,避免了视频回放时的重新下载,节省了带宽。
         缺点
        但是,请注意 RTMP 也有自身的缺点,最重要的几个是:
  • RTMP 使用了跟 HTTP 不同的协议和端口号,这使得它很容易遭受 (公司) 防火墙的封堵。可以使用 RTMPT (通过 HTTP 通道) 避免这个问题,但这需要服务器付出一定的性能代价。
  • RTMP 数据被流化后传给播放器,这意味着连接的带宽必须要比视频的数据速率大。如果连接中止了几秒,流将卡住。这个问题在很大问题上可以使用包含一个低质量文件的动态流来进行预防。

        最大的缺点是 RTMP 只能工作在 Flash 而不能工作在 HTML5。新的 HTTP 流协议,比如苹果的 HTTP Live Streaming (HLS),具有更广泛的设备支持 (比如 iOS),在未来的几年内很可能会取代 RTMP。JW Player 在 Flash 和 HTML5 模式下都能够支持苹果 HLS。

 

         服务器支持
        要使用 RTMP,你的主机或者 CDN 需要安装一个专用 RTMP 服务器。这里有两个主流产品,JW Player 都支持:
  • Wowza Media Server 是当前最广泛采用的解决方案。它包含了支持几乎所有的流媒体协议,包括 RTMP。Wowza 3 引入了对 JW6 SMIL manifest 的专用支持 (看下文)。
  • Adobe Media Server 是另外一个很好地选择。因为 Flash 是由 Adobe 开发的,RTMP 的新功能首先会在 FMS 上跑的通。
         CDNS
        以下 CDN (Content Delivery Networks 内容分发网络) 能够支持 RTMP,并且使用 JW Player 测试效果良好。它们都支持 动态 流,除了 CloudFront,也都支持现场 直播
  • Akamai
  • CDNetworks
  • CloudFront (Amazon 网络服务)
  • Edgecast
  • Limelight
         现场直播
        RTMP 的一个关键的特征就是能够进行现场直播,比如展示会,音乐会或者体育赛事。在 JW Player 和一台 RTMP 服务器之后,你还需要一个小工具来将直播视频提取给服务器。有很多这样的工具可供选择。 Flash Live Media Encoder  就是这样的一个免费的,可以用于 Windows 和 Mac 的工具。
        对于 FMS 和 Wowza,嵌入直播流的方式和嵌入点播的方式一样。但是,对于 Akamai、Edgecast 和 Limelight 等 CDN 要求播放器订阅到直播流。JW Player 6 支持这种机制
        JW Player 6 将会像嵌入一个点播文件一样嵌入一个直播流,但有个例外:取代显示在时间轴上的滑块 (直播嘛) 的是播放器在控制条上显示时间的标题。
         负载均衡
        对于大规模的部署,JW Player 为支持服务器的负载均衡提供了三个机制:
  • DNS 负载均衡,独立于 JW Player。
  • RTMP 302 重定向,被 Wowza 用于负载均衡。更多信息参考他们的用户指南。
  • SMIL 负载均衡,包含 RTMP 链接到边缘节点的一个初始化 SMIL 文件。可以参见下面关于 SMIL 文件动态流的例子。
         隐藏字幕
        JW Player 支持 RTMP 直播和点播的字幕隐藏。只支持一个单一的 CC 轨道,而且这个轨道必须是 TX3G 格式的。Wowza 和 Adobe media server 都有能力使用 RTMP 发送 TX3G 字幕。

        JW Player 第一次遭遇一个文本提示的 TX3G 时,它在控制条中放置了一个 CC 按钮。如果用户选择启用 CC,这一偏好会被保存在 cookie,用户以后观看任何视频时 CC 都会是启用状态。

 

         嵌入一个流
        嵌入一个 RTMP 流到 JW Player 6 只是简单提供一个完整流 URL 的问题。这里是一个很基本的例子,播放一个 MP4 视频:
1jwplayer("myElement").setup({ 
2    file: "rtmp://example.com/application/mp4:myVideo.mp4"
3    image: "/assets/myVideo.jpg"
4    height: 360, 
5    width: 640 
6});


        以上例子仅仅工作在桌面上,因为 Flash 在移动终端不可用。下面是另一个例子,使用 RTMP 和 HTTP 加载的一个 MP4。RTMP 流将会在桌面播放,下载的 HTTP 将会在移动终端播放:
01jwplayer("myElement").setup({ 
02    playlist: [{ 
03        image: "/assets/myVideo.jpg"
04        sources: [{  
05            file: "rtmp://example.com/application/mp4:myVideo.mp4" 
06        },{ 
07            file: "/assets/myVideo.mp4" 
08        }] 
09    }], 
10    height: 360, 
11    primary: "flash"
12    width: 640 
13});


        因为 主要 呈现模式设置为  Flash ,RTMP 流被选中。如果这一选项没有设置,JW Player 将会播放 HTTP 下载,因为很多浏览器 (比如 Chrome、IE)在 HTML5 中支持那个 (JW6 中的默认模式)。
        参见  Working with Playlists  以获取关于加载多路源的更多信息。
         应用和流
        技术上讲,一个 RTMP 流包含两块:
  • 应用路径 (例如rtmp://example.com/vod/)。
  • 标识 (例如mp4:myFolder/video.mp4)。
        JW Player 6 中,这两块被整合到单个 URL。JW Player 根据  mp4 flv  或者  mp3  前缀的位置来决定应用和流之间的分割。
        1. MP4/M4V/MOV/F4V 视频需要一个  mp4:  前缀:
 
  1. rtmp://example.com/vod/mp4:myFolder/myVideo.mp4  

        2. FLV 视频或者一个直播流 (FLV 容器下的) 需要一个  flv:  前缀:
 
  1. rtmp://example.com/vod/flv:myFolder/myVideo.flv  
  2. rtmp://example.com/live/flv:myFolder/myLiveStream  

        3. MP3 音频需要一个  mp3:  前缀:
 
  1. rtmp://example.com/vod/mp3:myFolder/mySong.mp3  

        4. M4A/F4A/AAC 音频文件也需要一个  mp4:  前缀:
 
  1. rtmp://example.com/vod/mp4:myFolder/mySong.m4a  

        如果没有找到任何前缀,player 在文件名最后一个 / 之后对应用和流进行分割。前缀随后被自动添加 (mp4:mp3:)。注意flv 前缀并不被 Wowza/Adobe 服务器内部使用,因此 JW Player 将在请求流之前将其剥离。

 

         动态流
        除了加载单一 RTMP 流之外,JW Player 6 支持加载动态流。一个 动态 流包含多个具有同一内容的单流,它们具有不同的品质。JW Player 允许在这样一个流中进行不同品质的自动或者手工切换。
        动态流必须使用叫做 SMIL manifest 设置。这是一些包含有 RTMP 应用路径加上存放在 RTMP 服务器上的流的路径的简单的 XML 文件。播放器经常假定一个带有 .smil  后缀的文件是一个 RTMP SMIL manifest:
1jwplayer("myElement").setup({ 
2    file: "/assets/myVideo.smil"
3    image: "/assets/myVideo.jpg"
4    height: 360, 
5    width: 640 
6});

        这是另一个例子,使用了一个 RTMP 动态流 (为桌面) 和一个渐进 MP4 下载 (为移动终端):
01jwplayer("myElement").setup({ 
02    playlist: [{ 
03        image: "/assets/myVideo.jpg"
04        sources: [{  
05            file: "/assets/myVideo.smil"  
06        },{ 
07            file: "/assets/myVideo.mp4"  
08        }] 
09    }], 
10    height: 360, 
11    primary: "flash"
12    width: 640 
13});

        注意 SMIL manifest 是  跨域安全限制  的主题。如果你的 SMIL 文件位于你的网站或播放器之外的另一台服务器上,你需要去设置一个  crossdomain.xml  文件。
         SMIL 内容
        这是一个基本的例子,使用了三个不同的流:
01<smil
02  <head
03    <meta base="rtmp://example.com/vod/"/> 
04  </head
05  <body
06    <switch
07      <video src="myVideo-high.mp4" height="720" system-bitrate="2000000" width="1280"/> 
08      <video src="myVideo-medium.mp4" height="360" system-bitrate="800000" width="640"/> 
09      <video src="myVideo-low.mp4" height="180" system-bitrate="300000" width="320"/> 
10    </switch
11  </body
12</smil>


        品质的切换由 JW Player 自动完成,它将选用最高品质:
  • 谁的 system-bitrate 更适合连接的当前带宽。
  • 谁的 width 更适合播放器屏幕的当前宽度。
        用户可以通过设置快捷菜单中的品质对这些自动选项进行重写。manifest 中的 关于流的 height 属性用于设置菜单的标签 (例如  720p )。
         WOWZA 3
        Wowza Media Server 3 为这些 SMIL manifest 引入了专门的支持。如果你在运行 3.1.2.15 或更高版本的 Wowza,在你适配的流的 URL 后面添加 /jwplayer.smil  来得到这些 manifest。
        这里是 Wowza3 中 SMIL manifest 和 M3U8 manifest 的 URL 的样子:
 
  1. http://example.com/vod/smil:myvideo.smil/jwplayer.smil  
  2. http://example.com/vod/smil:myvideo.smil/manifest.m3u8  

 

 

         配置选项
        RTMP 提供了一些配置选项来对流的播放进行调整。它们设置在一个专用的  rtmp  选项块中。
         缓冲长度
        在默认情况下,JW Player 试着为 RTMP 视频维护一个长度为 3 秒的缓冲。这意味着有三秒钟的视频被从服务器端获取并随时可以播放。这个长度可以使用 RTMP bufferlength  选项进行修改:
 
  1. 1jwplayer("myElement").setup({ 
    2    file: "rtmp://example.com/vod/mp4:myVideo.mp4"
    3    height: 360, 
    4    image: "/assets/myVideo.jpg"
    5    rtmp: { 
    6        bufferlength: 0.1 
    7    }, 
    8    width: 640 
    9});

        可用值的范围是从  0.1  (对于低延时的直播) 到  10  (为防止频繁的重缓冲)。
         FC 订阅
        当使用 Akamai、Edgecast 或者 Limelight 等 CDN 分发直播流时,播放器不能简简单单地连接到直播流。播放器需要通过发送一个叫做 FC Subscribe  的调用到服务器进行订阅。JW Player 包含了对此的支持,使用 RTMP subscribe  选项:
1jwplayer("myElement").setup({ 
2    file: "rtmp://example.com/xxxx/myStream"
3    height: 360, 
4    image: "/assets/myLivestream.jpg"
5    rtmp: { 
6        subscribe: true 
7    }, 
8    width: 640 
9});

        注意这一个功能仅适用于单一 RTMP 流。对于多位率的直播流,应该使用 HLS 协议。
         安全令牌
        Wowza Media Server 具有一个叫做 安全令牌 的特性,用于保护你的流被下载。它通过播放器发送给服务器一个令牌,然后服务器在开始发送流之前对令牌验证进行工作。JW Player 通过使用 RTMP securetoken  选项支持这一机制:
查看源码
打印 ?
1jwplayer("myElement").setup({ 
2    file: "rtmp://example.com/vod/mp4:myVideo.mp4"
3    height: 360, 
4    image: "/assets/myVideo.jpg"
5    rtmp: { 
6        securetoken: "Kosif093n203a" 
7    }, 
8    width: 640 
9});

        注意我们不支持编译安全令牌的选项。SWF 通过提供了对 JS (它们都是客户端) 的安全增强,尤其是当 JS 代码有点混乱时。
原文链接: http://www.longtailvideo.com/support/jw-player/28854/using-rtmp-streaming/

这篇关于使用 JW Player 播放RTMP 流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846272

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND