心灵的宁静 發表於 2021-2-26 11:16:00

HTML5原生<video>与 flv.js

<p><span style="font-size: 18px">1,以前很多浏览器播放视频需要用Adobe Flash等插件,Flash应用非常广泛,但却存在很多安全漏洞</span></p>
<p>&nbsp; &nbsp;flash为什么被淘汰了</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">2,W3C的最新的HTML5标准中,定义了一系列新的元素来避免使用插件,&lt;video&gt;和&lt;audio&gt;</span></p>
<p>Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 支持 &lt;video&gt; 元素</p>
<p>但是,<strong>HTML5中的&lt;video&gt;只支持Ogg、MP4、WebM</strong></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">3,国内很多视频平台不开放HTNL5?</span></p>
<p><span style="font-size: 16px"><span style="font-size: 14px">(1)历史遗留问题,HTML5 标准以前,Flash 在 Web 视频播放方面有着统治地位。</span></span></p>
<p>(2)视频网站的视频源和转码设置,<strong>很多都高清源都是适用于 Flash 播放的 FLV 格式</strong>,只有少量低清晰度视频是 mp4 格式,webm 和 ogg 更是听都没听说过。</p>
<div>
<div>(3)比如优酷只有高清和标清才有 MP4 源,超清、1080P 等,基本都是 FLV 和 HLS(M3U8)的视频源。</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;而腾讯视频,因为转型 MP4 比较早,视频源几乎全部都是 MP4 和 HLS,所以现在可以在 Mac OS X 上率先支持 PC Web 端的 HTML5 播放器(Safari 下 HLS、Chrome 下 MP4)。</div>
<div>&nbsp;</div>
<div><span style="font-size: 18px">4,HTNL5一定不能支持flv格式吗?</span></div>
<div>&nbsp;</div>
方法:媒体源扩展 API(MSE) 提供了实现无插件且基于 Web 的流媒体的功能。</div>
<div>使用 MSE,媒体串流能够通过 JavaScript 创建,并且能通过使用&nbsp;<code>&lt;audio&gt;</code>&nbsp;和&nbsp;<code>&lt;video&gt;</code>&nbsp;元素进行播放。<br><br></div>
<div>
<div>HTML5 &lt;video&gt; 不仅可以直接播放上面支持的 mp、webm、ogg 格式,还可以支持由 JS 处理过后的视频流,这样我们就可以用 JS 把一些不支持的视频流格式,转化为支持的格式</div>





</div>
<div>&nbsp;</div>
<div><span style="font-size: 18px">5,MSE 技术</span><br>B 站开源的 flv.js 就是这个技术的一个典型实现。B 站的 PC HTML5 播放器,就是用 MSE 技术,将 FLV 源用 JS 实时转码成 HTML5 支持的视频流编码格式</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>尝试使用腾讯的tcplayer&nbsp; &nbsp;和&nbsp; flv.js&nbsp; &nbsp;</p>
<p>yarn add tcplayer</p>
<p>&nbsp;tcplayer 的包没有index.d.ts,需要在angular.json&nbsp;</p>
<div class="cnblogs_code">
<pre>"scripts"<span style="color: rgba(0, 0, 0, 1)">: [
"node_modules/tcplayer/index.js"
]</span></pre>
</div>
<p>yarn add flv.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ng-container </span><span style="color: rgba(255, 0, 0, 1)">*ngIf</span><span style="color: rgba(0, 0, 255, 1)">="extension !== '.flv'"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="id_test_video"</span><span style="color: rgba(255, 0, 0, 1)"> style</span><span style="color: rgba(0, 0, 255, 1)">="width:100%; height:auto;"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ng-container </span><span style="color: rgba(255, 0, 0, 1)">*ngIf</span><span style="color: rgba(0, 0, 255, 1)">="extension === '.flv'"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">video </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="videoElement"</span><span style="color: rgba(255, 0, 0, 1)"> width</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> height</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> controls</span><span style="color: rgba(0, 0, 255, 1)">="controls"</span><span style="color: rgba(255, 0, 0, 1)"> autoplay</span><span style="color: rgba(0, 0, 255, 1)">="autoplay"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<div class="cnblogs_code">
<pre>import { TcPlayer } from 'tcplayer'<span style="color: rgba(0, 0, 0, 1)">;
import flvjs from </span>'flv.js'<span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.extension === '.flv'<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (flvjs.isSupported()) {
          const videoElement: any </span>= document.getElementById('videoElement'<span style="color: rgba(0, 0, 0, 1)">);
          const flvPlayer </span>=<span style="color: rgba(0, 0, 0, 1)"> flvjs.createPlayer({
            type: </span>'flv'<span style="color: rgba(0, 0, 0, 1)">,
            url: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.url
          });
          flvPlayer.attachMediaElement(videoElement);
          flvPlayer.load();
          flvPlayer.play();
      }
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      const exten </span>= <span style="color: rgba(0, 0, 255, 1)">this</span>.extension.substring(1<span style="color: rgba(0, 0, 0, 1)">);
      const option </span>=<span style="color: rgba(0, 0, 0, 1)"> {
          autoplay: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> iOS 下 safari 浏览器,以及大部分移动端浏览器是不开放视频自动播放这个能力的</span>
          <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> poster: '',</span>
          width: '800', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 视频的显示宽度,请尽量使用视频分辨率宽度</span>
          height: '450', <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 视频的显示高度,请尽量使用视频分辨率高度</span>
<span style="color: rgba(0, 0, 0, 1)">          wording: {
            </span>12: '请填写视频播放地址'<span style="color: rgba(0, 0, 0, 1)">,
            </span>2032: '请求视频失败,请检查网络'<span style="color: rgba(0, 0, 0, 1)">,
            </span>2048: '请求m3u8文件失败,可能是网络错误或者跨域问题'<span style="color: rgba(0, 0, 0, 1)">
         }
      };
      option </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.url;
      const player </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> TcPlayer('id_test_video'<span style="color: rgba(0, 0, 0, 1)">, option);
      }</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>tcplayer只支持MP4和hls(m3u8),&nbsp; 2020.12.31号后Adobe flash又不能用了,又暂时不需要用hls,还不如用原生video+flv.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ng-container </span><span style="color: rgba(255, 0, 0, 1)">*ngIf</span><span style="color: rgba(0, 0, 255, 1)">="extension !== '.flv'"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">video </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="video_element"</span><span style="color: rgba(255, 0, 0, 1)"> width</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> height</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> controls</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><strong><span style="color: rgba(255, 0, 0, 1)"> controlsList</span><span style="color: rgba(0, 0, 255, 1)">="nodownload"</span></strong><span style="color: rgba(255, 0, 0, 1)"> autoplay</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">&gt;//禁用控制栏右边...的视屏下载</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">source </span><span style="color: rgba(255, 0, 0, 1)"></span><span style="color: rgba(0, 0, 255, 1)">="url"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="video/ogg"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">source </span><span style="color: rgba(255, 0, 0, 1)"></span><span style="color: rgba(0, 0, 255, 1)">="url"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="video/mp4"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">source </span><span style="color: rgba(255, 0, 0, 1)"></span><span style="color: rgba(0, 0, 255, 1)">="url"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="video/webm"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ng-container </span><span style="color: rgba(255, 0, 0, 1)">*ngIf</span><span style="color: rgba(0, 0, 255, 1)">="extension === '.flv'"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">video </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="video_element"</span><span style="color: rgba(255, 0, 0, 1)"> width</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> height</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> controls</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> autoplay</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.extension === '.flv'<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (flvjs.isSupported()) {
          const videoElement: any </span>= document.getElementById('video_element'<span style="color: rgba(0, 0, 0, 1)">);
          const flvPlayer </span>=<span style="color: rgba(0, 0, 0, 1)"> flvjs.createPlayer({
            type: </span>'flv'<span style="color: rgba(0, 0, 0, 1)">,
            url: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.url
          });
          flvPlayer.attachMediaElement(videoElement);
          flvPlayer.load();
          flvPlayer.play();
      }
      }<br></span></pre>
<div>
<div>//&nbsp;禁用右键下载视频</div>
<div>$('#video_element').on('contextmenu',&nbsp;()&nbsp;=&gt;&nbsp;{&nbsp;return&nbsp;false;&nbsp;});</div>
</div>
<pre><span style="color: rgba(0, 0, 0, 1)">&nbsp;</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>移动端浏览器播放</strong></span></p>
<div>x5-video-player-type="h5"&nbsp; 使&lt;video&gt;在微信上不在最上层</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="video_container"</span><span style="color: rgba(255, 0, 0, 1)"> *ngIf</span><span style="color: rgba(0, 0, 255, 1)">="extension !== '.flv'"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">video </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="video_element"</span><span style="color: rgba(255, 0, 0, 1)"> width</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> controls</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> controlsList</span><span style="color: rgba(0, 0, 255, 1)">="nodownload"</span><span style="color: rgba(255, 0, 0, 1)"> autoplay</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> webkit-playsinline
    x5-video-player-type</span><span style="color: rgba(0, 0, 255, 1)">="h5"</span><span style="color: rgba(255, 0, 0, 1)"> playsinline</span><span style="color: rgba(0, 0, 255, 1)">&gt; // 使不全屏播放</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">source </span><span style="color: rgba(255, 0, 0, 1)"></span><span style="color: rgba(0, 0, 255, 1)">="url"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="video/ogg"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">source </span><span style="color: rgba(255, 0, 0, 1)"></span><span style="color: rgba(0, 0, 255, 1)">="url"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="video/mp4"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">source </span><span style="color: rgba(255, 0, 0, 1)"></span><span style="color: rgba(0, 0, 255, 1)">="url"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="video/webm"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="video_container"</span><span style="color: rgba(255, 0, 0, 1)"> *ngIf</span><span style="color: rgba(0, 0, 255, 1)">="extension === '.flv'"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">video </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="video_element"</span><span style="color: rgba(255, 0, 0, 1)"> width</span><span style="color: rgba(0, 0, 255, 1)">="100%"</span><span style="color: rgba(255, 0, 0, 1)"> controls</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> autoplay</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">.video_container </span>{<span style="color: rgba(255, 0, 0, 1)">
display</span>:<span style="color: rgba(0, 0, 255, 1)"> flex</span>;<span style="color: rgba(255, 0, 0, 1)">
width</span>:<span style="color: rgba(0, 0, 255, 1)"> 100%</span>;<span style="color: rgba(255, 0, 0, 1)">
height</span>:<span style="color: rgba(0, 0, 255, 1)"> 100%</span>;<span style="color: rgba(255, 0, 0, 1)">
#video_element {
    margin</span>:<span style="color: rgba(0, 0, 255, 1)"> auto</span>; // 垂直居中
}<span style="color: rgba(128, 0, 0, 1)">
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.extension === '.flv'<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (flvjs.isSupported()) {
          const video_element: any </span>= document.getElementById('video_element'<span style="color: rgba(0, 0, 0, 1)">);
          const flvPlayer </span>=<span style="color: rgba(0, 0, 0, 1)"> flvjs.createPlayer({
            type: </span>'flv'<span style="color: rgba(0, 0, 0, 1)">,
            url: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.url,
          });
          flvPlayer.attachMediaElement(video_element);
          flvPlayer.load();
          flvPlayer.play();
      }
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
      const video_element: any </span>= document.getElementById('video_element'<span style="color: rgba(0, 0, 0, 1)">);
      video_element.addEventListener(</span>'loadedmetadata', () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
          video_element.play(); // 加载完再播放
      });
      }</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1374003/202103/1374003-20210305182336594-275887117.png"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/tingying/p/14451195.html
頁: [1]
查看完整版本: HTML5原生<video>与 flv.js