HTML5原生<video>与 flv.js
<p><span style="font-size: 18px">1,以前很多浏览器播放视频需要用Adobe Flash等插件,Flash应用非常广泛,但却存在很多安全漏洞</span></p><p> flash为什么被淘汰了</p>
<p> </p>
<p><span style="font-size: 18px">2,W3C的最新的HTML5标准中,定义了一系列新的元素来避免使用插件,<video>和<audio></span></p>
<p>Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 支持 <video> 元素</p>
<p>但是,<strong>HTML5中的<video>只支持Ogg、MP4、WebM</strong></p>
<p> </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> 而腾讯视频,因为转型 MP4 比较早,视频源几乎全部都是 MP4 和 HLS,所以现在可以在 Mac OS X 上率先支持 PC Web 端的 HTML5 播放器(Safari 下 HLS、Chrome 下 MP4)。</div>
<div> </div>
<div><span style="font-size: 18px">4,HTNL5一定不能支持flv格式吗?</span></div>
<div> </div>
方法:媒体源扩展 API(MSE) 提供了实现无插件且基于 Web 的流媒体的功能。</div>
<div>使用 MSE,媒体串流能够通过 JavaScript 创建,并且能通过使用 <code><audio></code> 和 <code><video></code> 元素进行播放。<br><br></div>
<div>
<div>HTML5 <video> 不仅可以直接播放上面支持的 mp、webm、ogg 格式,还可以支持由 JS 处理过后的视频流,这样我们就可以用 JS 把一些不支持的视频流格式,转化为支持的格式</div>
</div>
<div> </div>
<div><span style="font-size: 18px">5,MSE 技术</span><br>B 站开源的 flv.js 就是这个技术的一个典型实现。B 站的 PC HTML5 播放器,就是用 MSE 技术,将 FLV 源用 JS 实时转码成 HTML5 支持的视频流编码格式</div>
<p> </p>
<p> </p>
<p>尝试使用腾讯的tcplayer 和 flv.js </p>
<p>yarn add tcplayer</p>
<p> tcplayer 的包没有index.d.ts,需要在angular.json </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)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">></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> </p>
<p> </p>
<p>tcplayer只支持MP4和hls(m3u8), 2020.12.31号后Adobe flash又不能用了,又暂时不需要用hls,还不如用原生video+flv.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">>//禁用控制栏右边...的视屏下载</span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ng-container</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p> </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>// 禁用右键下载视频</div>
<div>$('#video_element').on('contextmenu', () => { return false; });</div>
</div>
<pre><span style="color: rgba(0, 0, 0, 1)"> </span></pre>
</div>
<p> </p>
<p> </p>
<p><span style="font-size: 18px"><strong>移动端浏览器播放</strong></span></p>
<div>x5-video-player-type="h5" 使<video>在微信上不在最上层</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">> // 使不全屏播放</span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">video</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></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', () =><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> </p><br><br>
来源:https://www.cnblogs.com/tingying/p/14451195.html
頁:
[1]