在线学习
概括理解:流媒体就是将视频文件分成许多小块儿,将这些小块儿作为数据包通过网络发送出去,实现一边传输视
频 数据 包一边观看视频。
HLS是什么?
HLS的工作方式是:将视频拆分成若干ts格式的小文件,通过m3u8格式的索引文件对这些ts小文件建立索引。一般10秒一个ts文件,播放器连接m3u8文件播放,当快进时通过m3u8即可找到对应的索引文件,并去下载对应的ts文件,从而实现快进、快退以近实时 的方式播放视频。
IOS、Android设备、及各大浏览器都支持HLS协议。
视频编码
视频编码格式
详情参考 :https://baike.baidu.com/item/%E8%A7%86%E9%A2%91%E7%BC%96%E7%A0%81/839038
首先我们要分清文件格式和编码格式:
文件格式:是指.mp4、.avi、.rmvb等 这些不同扩展名的视频文件的文件格式 ,视频文件的内容主要包括视频和音
频,其文件格式是按照一 定的编码格式去编码,并且按照该文件所规定的封装格式将视频、音频、字幕等信息封装在一起,播放器会根据它们的封装格式去提取出编码,然后由播放器解码,最终播放音视频。
音视频编码格式:通过音视频的压缩技术,将视频格式转换成另一种视频格式,通过视频编码实现流媒体的传输。
比如:一个.avi的视频文件原来的编码是a,通过编码后编码格式变为b,音频原来为c,通过编码后变为d。
音视频编码格式各类繁多,主要有几下几类:
MPEG系列 (由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发 )视频编码方面主要是Mpeg1(vcd用
的就是它)、Mpeg2(DVD使用)、Mpeg4(的DVDRIP使用的都是它的变种,如:divx,xvid等)、Mpeg4
AVC(正热门);音频编码方面主要是MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的mp3)、
MPEG-2 AAC 、MPEG-4 AAC等等。注意:DVD音频没有采用Mpeg的。
H.26X系列 (由ITU[国际电传视讯联盟]主导,侧重网络传输,注意:只是视频编码) 包括H.261、H.262、
H.263、H.263+、H.263++、H.264(就是MPEG4 AVC-合作的结晶)
目前最常用的编码标准是视频H.264,音频AAC。
提问:
H.264是编码格式还是文件格式? 编码格式
mp4是编码格式还是文件格式? 文件格式
FFmpeg 的基本使用
下载:FFmpeg
https://www.ffmpeg.org/download.html#build-windows
下载 :ffmpeg-20180227-fa0c9d6-win64-static.zip,并解压,本教程将ffmpeg解压到了
F:\devenv\edusoft\ffmpeg-20180227-fa0c9d6-win64-static\ffmpeg-20180227-fa0c9d6-win64-static下。
将F:\devenv\edusoft\ffmpeg-20180227-fa0c9d6-win64-static\ffmpeg-20180227-fa0c9d6-win64-static\bin目录配置在path环境变量中:
检测是否安装成功:
简单的测试:
将一个.avi文件转成mp4、mp3、gif等。
比如我们将lucene.avi文件转成mp4,运行如下命令:
ffmpeg -i lucene.avi lucene.mp4
转成mp3:ffmpeg -i lucene.avi lucene.mp3
转成gif:ffmpeg -i lucene.avi lucene.gif
官方文档(英文):
http://ffmpeg.org/ffmpeg.html
生成m3u8/ts文件
使用ffmpeg生成 m3u8的步骤如下:
第一步:先将avi视频转成mp4
生成m3u8/ts文件,去视频所在目录中,cmd运行。
ffmpeg.exe -i lucene.avi -c:v libx264 -s 1280x720 -pix_fmt yuv420p -b:a 63k -b:v 753k -r 18 .\lucene.mp4
第二步:将mp4生成m3u8,注意,需要先创建hls文件夹
ffmpeg -i lucene.mp4 -hls_time 10 -hls_list_size 0 -hls_segment_filename ./hls/lucene_%05d.ts ./hls/lucene.m3u8
画面清晰度的码率
H5播放器
官方地址:
http://videojs.com/
下载video.js
Video.js :
https://github.com/videojs/video.js
具体用gitup的下载步骤截图:
videojs-contrib-hls :
https://github.com/videojs/videojs-contrib-hls#installation
( videojs-contrib-hls是播放hls的一个插件)
使用文档:
http://docs.videojs.com/tutorial-videojs_.html
本教程使用 video.js 6.7.3 版本,videojs-contrib-hls 5.14.1版本。
下载上边两个文件,为了测试需求将其放在门户的plugins目录中。
搭建学习中心前端
ngix媒体服务器的配置新增:(未成功,有路径访问301的跨域问题)
#学成网媒体服务代理
map $http_origin $origin_list{
default http://www.xuecheng.com;
"~http://www.xuecheng.com" http://www.xuecheng.com;
"~http://ucenter.xuecheng.com" http://ucenter.xuecheng.com;
}
#学成网媒体服务代理
server {
listen 80;
server_name video.xuecheng.com;
location /video {
proxy_pass http://video_server_pool;
#$origin_list,这个列表里的路径可以访问
add_header Access-Control-Allow-Origin $origin_list;
#设置可以跨域访问,*代表可以公共厕所,都能访问
#add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods GET;
}
}
#学成网媒体服务
server {
listen 90;
server_name localhost;
#视频目录
location /video/ {
alias D:/a1/xuechengzaixianUI/develop/video/;
}
}
#媒体服务
upstream video_server_pool{
server 127.0.0.1:90 weight=10;
}
#前端ucenter
upstream ucenter_server_pool{
#server 127.0.0.1:7081 weight=10;
server 127.0.0.1:13000 weight=10;
}
媒资管理服务端
6.2 开发环境
6.2.1 创建媒资mongo数据库
创建媒资服务工程
媒资管理的相关功能单独在媒资服务中开发,下边创建媒资服务工程(xc-service-manage-media)。
媒资服务的配置与cms类似,导入 “资料”–》xc-service-manage-media工程,工程结构如下:
上传文件和合并文件的测试代码案例(原理很重要)
6.3 上传文件
6.3.1 断点续传解决方案
通常视频文件都比较大,所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大
小没有限制,但是客户的网络环境质量、电脑硬件环境等参差不齐,如果一个大文件快上传完了网断了,电断了没
有上传完成,需要客户重新上传,这是致命的,所以对于大文件上传的要求最基本的是断点续传。
什么是断点续传:
引用百度百科:断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个
部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传
下载未完成的部分,而没有必要从头开始上传下载,断点续传可以提高节省操作时间,提高用户体验性。
如下图:
上传和下载的案例代码(很重要):
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.lang.reflect.Array;
import java.util.*;
import java.util.List;
@SpringBootTest
@RunWith(SpringRunner.class)
public class uploadTest {
//大文件上传断点续传的分块处理
@Test
public void testChunk() throws IOException {
//先指向要上传的大文件,源文件
File sourceFile = new File("D:\\a1\\xuechengzaixianUI\\develop\\video\\lucene.avi");
//把要上传的文件,存放到哪个目录
String chunkPath = "D:\\a1\\xuechengzaixianUI\\develop\\video\\chunk\\";
//判断有没有这个存放上传文件的目录文件夹,没有就创建一个
File chunkDirectory = new File(chunkPath);
if (!chunkDirectory.exists()){
//如果没有这个目录,就创建一个目录
chunkDirectory.mkdir();
}
//确定文件要分为多少块,先设定每块大小多大
long chunkSize = 1*1024*1024;
//通过除法公式:文件的字节长度*小数/每块字节大小,可能会有小数,需要向上取整
// 得到该文件要分为多少块
long chunkNum = (long) Math.ceil(sourceFile.length()*1.0/chunkSize);
//如果得到的分块小于1,证明不合法,就默认至少有一块。
if (chunkNum<=0){
chunkNum = 1;
}
//准备一个缓冲区
byte[] bytes = new byte[1024];
//准备一个随机读的对象,抛io异常,把文件放进去
RandomAccessFile raf_read = new RandomAccessFile(sourceFile,