admin管理员组

文章数量:1564192

在线学习


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

HLS是什么?

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

视频编码

视频编码格式
详情参考 :https://baike.baidu/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" http://www.xuecheng.com;
        "~http://ucenter.xuecheng" 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,

本文标签: 在线播放器清晰度断点视频文件