文章目录

  • 1. 流媒体
    • 1.1 流式传输
      • 1.1.2 顺序流式传输
      • 1.1.3 实时流式传输
  • 2. 点播
    • 2.1 点播方案
    • 2.2 什么是`HLS`
  • 3. 视频编码
    • 3.1 视频编码格式
    • 3.2 `FFmpeg` 的基本使用
    • 3.3 生成`m3u8`/`ts`文件
      • 3.3.1 先将`avi`视频转成`mp4`
      • 3.3.2 将`mp4`生成`m3u8`
    • 3.4 码率的设置
  • 4. 播放器
    • 4.1 技术选型
    • 4.2 `video.js`
  • 5. 开始配置nginx
  • 6. 编写测试页面`video.html`
  • 7. 测试
  • demo 地址

1. 流媒体

流媒体就是将视频文件分成许多小块儿,将这些小块儿作为数据包通过网络发送出去,实现一边传输视
频 数据 包一边观看视频。

1.1 流式传输

在网络上传输音、视频信息有两个方式:下载流式传输
下载:就是把音、视频文件完全下载到本机后开始播放,它的特点是必须等到视频文件下载完成方可播放,
播放等待时间较长,无法去播放还未下载的部分视频。
流式传输:就是客户端通过链接视频服务器实时传输音、视频信息,实现“边下载边播放”。
流式传输包括如下两种方式:

1.1.2 顺序流式传输

即顺序下载音、视频文件,可以实现边下载边播放,不过,用户只能观看已下载的视频内容,无法快进到未
下载的视频部分,顺序流式传输可以使用Http服务器来实现,比如NginxApache等。

1.1.3 实时流式传输

实时流式传输可以解决顺序流式传输无法快进的问题,它与Http流式传输不同,它必须使用流媒体服务器并
且使用流媒体协议来传输视频,它比Http流式传输复杂。常见的实时流式传输协议有RTSPRTMPRSVP
等。

  1. 将原始的视频文件通过编码器转换为适合网络传输的流格式,编码后的视频直接输送给媒体服务器。原始的视频文件通常是事先录制好的视频,比如通过摄像机、摄像头等录像、录音设备采集到的音视频文件,体积较大,要想在网络上传输需要经过压缩处理,即通过编码器进行编码 。
  2. 媒体服务获取到编码好的视频文件,对外提供流媒体数据传输接口,接口协议包括 :HTTPRTSPRTMP等 。
  3. 播放器通过流媒体协议与媒体服务器通信,获取视频数据,播放视频。

2. 点播

2.1 点播方案

  1. 播放器通过 http协议从http服务器上下载视频文件进行播放
    问题:必须等到视频下载完才可以播放,不支持快进到某个时间点进行播放
  2. 播放器通过rtmp协议连接媒体服务器以实时流方式播放视频
    使用rtmp协议需要架设媒体服务器,造价高,对于直播多采用此方案。
  3. 播放器使用HLS协议连接http服务器(NginxApache等)实现近实时流方式播放视频
    HLS协议规定:基于Http协议,视频封装格式为ts,视频的编码格式为H264,音频编码格式为MP3AAC或者AC-3

2.2 什么是HLS

HLS的工作方式是:将视频拆分成若干ts格式的小文件,通过m3u8格式的索引文件对这些ts小文件建立索引。一般10秒一个ts文件,播放器连接m3u8文件播放,当快进时通过m3u8即可找到对应的索引文件,并去下载对应的ts文件,从而实现快进、快退以近实时 的方式播放视频。
IOSAndroid设备、及各大浏览器都支持HLS协议。

采用 HLS方案即可实现边下载边播放,并可不用使用rtmp等流媒体协议,不用构建专用的媒体服务器,节省成本。

3. 视频编码

3.1 视频编码格式

所谓视频编码方式就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。视频流传输中最为重要的编解码标准有国际电联的H.261H.263H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-NetworksRealVideo、微软公司的WMV以及Apple公司的QuickTime等。

首先我们要分清文件格式和编码格式:
文件格式:是指.mp4.avi.rmvb等 这些不同扩展名的视频文件的文件格式 ,视频文件的内容主要包括视频和音频,其文件格式是按照一 定的编码格式去编码,并且按照该文件所规定的封装格式将视频、音频、字幕等信息封装在一起,播放器会根据它们的封装格式去提取出编码,然后由播放器解码,最终播放音视频。

音视频编码格式:通过音视频的压缩技术,将视频格式转换成另一种视频格式,通过视频编码实现流媒体的传输。
比如:一个.avi的视频文件原来的编码是a,通过编码后编码格式变为b,音频原来为c,通过编码后变为d。

音视频编码格式各类繁多,主要有几下几类:

  • MPEG系列 (由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发 )视频编码方面主要是Mpeg1vcd用的就是它)、Mpeg2DVD使用)、Mpeg4(的DVDRIP使用的都是它的变种,如:divxxvid等)、Mpeg4 AVC(正热门);音频编码方面主要是MPEG Audio Layer 1/2MPEG Audio Layer 3(大名鼎鼎的mp3)、MPEG-2 AACMPEG-4 AAC等等。注意:DVD音频没有采用Mpeg的。
  • H.26X系列 (由ITU[国际电传视讯联盟]主导,侧重网络传输,注意:只是视频编码) 包括H.261H.262
    H.263H.263+H.263++H.264(就是MPEG4 AVC-合作的结晶)

目前最常用的编码标准是视频H.264,音频AAC

3.2 FFmpeg 的基本使用

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPLGPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg被许多开源项目采用,QQ影音、暴风影音、VLC等。
下载:FFmpeg

下载 :ffmpeg.zip,并解压,本教程将ffmpeg解压到D:\program\ffmpeg-20191229-e20c6d9-win64-static

ffmpeg配置到path环境变量中

检测是否安装成功

ffmpge -version

简单的测试:
将一个.avi文件转成mp4mp3gif等。
比如我们将test.avi文件转成mp4,运行如下命令:

ffmpeg -i test.avi test.mp4

转成mp3

ffmpeg -i test.avi test.mp3

转成gif

ffmpeg -i lucene.avi lucene.gif

3.3 生成m3u8/ts文件

使用ffmpeg生成 m3u8的步骤如下(这里以avi格式为例,其他类似):

3.3.1 先将avi视频转成mp4

ffmpeg.exe ‐i  test.avi ‐c:v libx264 ‐s 1280x720 ‐pix_fmt yuv420p ‐b:a 63k ‐b:v 753k ‐r 18 .\test.mp4

下面把各参数意思大概讲讲,大概了解意思即可,不再此展开流媒体专业知识的讲解。

  • -c:v 视频编码为x264x264编码是H264的一种开源编码格式。
  • -s 设置分辨率
  • -pix_fmt yuv420p:设置像素采样方式,主流的采样方式有三种,YUV4:4:4YUV4:2:2YUV4:2:0,它的作用是根据采样方式来从码流中还原每个像素点的YUV(亮度信息与色彩信息)值。
  • -b 设置码率,-b:a-b:v分别表示音频的码率和视频的码率,-b表示音频加视频的总码率。码率对一个视频质量有很大的作用。
  • -r:帧率,表示每秒更新图像画面的次数,通常大于24肉眼就没有连贯与停顿的感觉了。

3.3.2 将mp4生成m3u8

ffmpeg ‐i  test.mp4   ‐hls_time 10 ‐hls_list_size 0  ‐hls_segment_filename
./hls/test_%05d.ts ./hls/test.m3u8
  • -hls_time 设置每片的长度,单位为秒
  • -hls_list_size n: 保存的分片的数量,设置为0表示保存所有分片
  • -hls_segment_filename :段文件的名称,%05d表示5位数字
    生成的效果是:将test.mp4视频文件每10秒生成一个ts文件,最后生成一个m3u8文件,m3u8文件是ts的索引文件。

经测试可以使用potplayer播放test.m3u8

3.4 码率的设置

码率又叫比特率即每秒传输的bit数,单位为bps(Bit Per Second),码率越大传送数据的速度越快。
码率的计算公式是:文件大小(转成bit)/ 时长(秒)/1024 = kbps即每秒传输千位数
例如一个1M的视频,它的时长是10s,它的码率等于

1*1024*1024*8/10/1024 = 819Kbps

码率设置到多少才能达到最好,通过根据个人的经验或参考一些视频网台给出的参考,下图是优酷对码率的要求:

如果要将视频上传到优酷则必须按照上面的要求,如果是自己搭建视频服务器,码率设置不易过大,最终达到的视
频清晰度满足业务需求即可。

4. 播放器

4.1 技术选型

视频编码后要使用播放器对其进行解码、播放视频内容。在web应用中常用的播放器有flash播放器、H5播放器或浏览器插件播放器,其中以flashH5播放器最常见。

flash播放器:缺点是需要在客户机安装Adobe Flash Player播放器,优点是flash播放器已经很成熟了,并且浏览器对flash支持也很好。

H5播放器:基于h5自带video标签进行构建,优点是大部分浏览器支持H5,不用再安装第三方的flash播放器,并且随着前端技术的发展,h5技术会越来越成熟。


4.2 video.js

本项目采用H5播放器,使用Video.js开源播放器。
**Video.js**是一款基于HTML5世界的网络视频播放器。它支持HTML5Flash视频,它支持在台式机和移动设备上播放视频。这个项目于2010年中开始,目前已在40万网站使用。
官方地址:http://videojs.com/

下载video.js

Video.js : https://github.com/videojs/video.js
videojs-contrib-hls : https://github.com/videojs/videojs-contrib-hls#installation
videojs-contrib-hls是播放hls的一个插件)
使用文档:http://docs.videojs.com/tutorial-videojs_.html

5. 开始配置nginx

正常使用video.js播放视频是通过一个网页,用户通过浏览器打开网页去播放视频,网页和视频都从web服务器请求,通常视频的url地址使用单独的域名。

下面配置是nginx服务器的配置

worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen 80;server_name localhost;# 视频目录location /video/ {alias  D:/test/video/;}}
}

6. 编写测试页面video.html

<!DOCTYPE html>
<html lang="en">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>视频播放</title><link href="./videojs/video-js.css" rel="stylesheet">
</head>
<body>
<video id=example-video width=800 height=600 class="video-js vjs-default-skin vjs-big-play-centered" controls poster="http://127.0.0.1/video/add.jpg"><sourcesrc="http://127.0.0.1/video/test.m3u8"type="application/x-mpegURL">
</video>
<input type="button" onClick="switchvideo()" value="switch"/><script src="./videojs/video.js"></script>
<script src="./videojs/videojs-contrib-hls.js"></script>
<script>var player = videojs('example-video');//player.play();function switchvideo(){player.src({src: 'http://127.0.0.1/video/test.m3u8',type: 'application/x-mpegURL',withCredentials: true});player.play();}
</script></body>
</html>

7. 测试

demo 地址

链接:https://share.weiyun.com/5FOQLhs 密码:9a5tyf

使用HLS协议连接nginx实现近实时流方式播放视频相关推荐

  1. 基于nginx搭建直播,web播放视频方案

    1 流媒体服务器nginx搭建: #nginx源码     git clone https://github.com/nginx/nginx.git #nginx的rtmp模块源码     git c ...

  2. 使用nginx搭建音视频点播服务——基于HLS协议

    文章目录 1 音视频技术 1.1 流媒体 1.2 点播与直播 1.3 HLS流媒体协议 1.4 CDN 2 搭建点播服务(音视频同理) 2.1 nginx服务器 2.2 nginx-vod-modul ...

  3. 小程序实现RTMP/HLS协议直播监控视频实时播放实现步骤

    小程序实现监控视频实时播放实现步骤 简述:RTMP协议直播视频,可使用小程序live-player组件实现视频播放,暂只针对国内主体特定类目的小程序开放,需要先通过类目审核,再在小程序管理后台,「开发 ...

  4. 基于Nginx+rtmp搭建支持hls协议的点播流媒体服务器(windows/Linux)

    前言:公司最近因为客户端视频文件过大导致视频加载时间很长,让我将视频播放做成流媒体点播的形式,于是查阅了几十篇相关文章以及文档,最终将功能实现.可能是存在版本差异,绝大部分文章介绍的教程并不能成功实施 ...

  5. 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步

    转载自 如何基于Canal 和 Kafka,实现 MySQL 的 Binlog 近实时同步 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先 ...

  6. centos7时间同步_基于 Canal 和 Kafka 实现 MySQL 的 Binlog 近实时同步

    点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 作者:Throwable    掘金:https://juejin.im/post ...

  7. 推流和拉流的概念以及RTMP和HLS协议

    https://www.bbsmax.com/A/x9J2wZM56o/ 推流为将直播内容推送至服务器的过程:拉流为服务器已有直播内容,用指定地址进行拉取的过程. rtmp rtmp是Real Tim ...

  8. 流媒体传输 - HLS 协议

    HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输.目前 HLS 协议被广泛的应用于视频点播和直播领域. ...

  9. 流媒体协议(一):HLS 协议

    一.HLS 概述 HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输.目前HLS协议被广泛的应用于视频点播 ...

最新文章

  1. hibernate ORM related
  2. 神经网络迭代次数的数学构成
  3. 数据“土豪”电信云告诉你,如何“玩转”数据生态
  4. 类的加载连接和初始化
  5. 32 bit 与 64 bit 程序(2)比较
  6. java进度条_自学java你需要知道的,适合编程小白
  7. 财子说丨王国斌:相信时间的力量
  8. Matlab:Matlab编程语言的简介、安装、学习路线(几十项代码编程案例分析)之详细攻略
  9. 管家婆ERP A8 3.7版本sql Server2005数据库修复成功
  10. 哈佛结构与冯诺伊曼结构
  11. 什么是802.11ac和802.11ac Wave2
  12. 招聘:JAVA软件开发工程师
  13. 分析与思考 黄奇帆的复旦经济课 读书笔记
  14. 三个团队的站立会议旁观笔记
  15. 临床执业助理医师(综合练习)题库【4】
  16. 基于spss的多元线性回归(逐步回归法 stepwise regression)
  17. Linux画图工具gnuplot
  18. 深度linux触摸板失灵,deepin下触摸板无法使用
  19. 阿呆喵广告过滤 v1.9.0.1 官网版
  20. Accelerated C++:通过示例进行编程实践——练习解答(第4章)

热门文章

  1. Python生成二维码的操作方法
  2. 游戏的革命:手机定位游戏
  3. 安装完Tensorflow却找不到指定模块
  4. Love Letter
  5. Java对象的生命周期与垃圾回收以及四种引用
  6. vivado 如何添加时序约束
  7. 《麦田里的守望者》中最喜欢的两句话
  8. seller_info-获得淘宝店铺详情,获得店铺电话API接口,店铺详情接口接入说明
  9. login.keyring的问题
  10. 2019年安徽省c语言二级答案,2019年春江苏省计算机二级C语言真题