视频文件转M3U8

news2025/1/17 9:04:31

前言

        前段时间遇到一个播放视频的项目,为了防止登录的用户下载项目的视频,所以需要对视频加密,即使用户下载也不能播放;因为前端采用videojs,最后确认方案是将mp4转m3u8文件格式,来实现视频文件加密播放。下面做一下总结。

一、什么是HLS

        HLS(HTTP Live Streaming的缩写)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。HLS协议基于HTTP协议,客户端按照顺序使用HTTP协议下载存储在服务器上的文件。HLS协议规定,视频的封装格式是TS(Transport Stream),除了TS视频文件本身,还定义了用来控制播放的M3U8文件(文本文件)。HLS协议的工作原理是把整个视频流分割成一个个小的TS格式视频文件来传输,在开始一个流媒体会话时,客户端会先下载一个包含TS文件URL地址的M3U8文件(相当于一个播放列表),给客户端用于下载TS文件。

二、M3U8格式标准介绍

        M3U8是一种常见的流媒体格式,主要以文件列表的形式存在,既支持直播又支持点播,尤其在Android、iOS等平台最为常用,下面就来看一下M3U8的最简单的例子:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.000000,
out0.ts
#EXTINF:10.000000,
out1.ts
#EXTINF:10.000000,
out2.ts
#EXTINF:10.000000,
out3.ts
#EXTINF:6.120000,
out4.ts

#EXTM3U:M3U8文件头,必须放在第一行。
#EXT-X-VERSION:M3U8文件的版本,常见的是3,其实版本已经发展了很多了。
#EXT-X-MEDIA-SEQUENCE :第一个TS分片的序列号,一般情况下是0,但是在直播场景下,这个序列号标识直播段的起始位置。
#EXT-X-TARGETDURATION:每个分片TS的最大的时长;例如:EXT-X-TARGETDURATION:10 ,表示每个分片的最大时长是10秒。
#EXT-X-ALLOW-CACHE:是否允许cache;例如:EXT-X-ALLOW-CACHE:YES 、EXT-X-ALLOW-CACHE:NO,默认情况下是YES。
#EXT-X-ENDLIST:M3U8文件结束符。
#EXTINF:extra info,分片TS的信息,如时长,带宽等;一般情况下是 #EXTINF:<duration>,[<title>] 后面可以跟其他的信息,逗号之前是当前分片的TS时长。分片时长要小于 EXT-X-TARGETDURATION 定义的值。
#EXT-X-DISCONTINUITY:该标签表明其前一个切片与下一个切片之间存在中断。
#EXT-X-PLAYLIST-TYPE :表明流媒体类型。
#EXT-X-KEY:是否加密解析。例如:#EXT-X-KEY:METHOD=AES-128,URI="https://example.com/video.key?token=xxx" 加密算法是AES-128,密钥通过请求 https://example.com/video.key?token=xxx 来获取,密钥请求回来以后存储在本地,并用于解密后续下载的TS视频文件。

上面介绍的是最常见的playlist,还有一种playlist,仅包含播放节目列表信息,在HLS中称为master playlist,也是二级索引的结构,其示例如下:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000, RESOLUTION=720x480
http://example.com/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=2, BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000, RESOLUTION=1080x720
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=3, BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000, RESOLUTION=1920x1080
http://example.com/high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=4, BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8

#EXT-X-STREAM-INF:用于标识一个Variant Stream,这是由一系列的Redition组成的。该标签的属性列表中包含了Variant Stream的描述信息。例如:BANDWIDTH表示Variant Stream中的峰值比特率,单位bits/s。
AVERAGE-BANDWIDTH表示Variant Stream中的平均比特率,单位bits/s。
CODECS包含Variant Stream中音视频编码格式相关的信息,比如上面的"mp4a.40.5"。
RESOLUTION包含Variant Stream中对应视频流的分辨率。
FRAME-RATE表示Variant Stream中的视频帧率。

三、FFmpeg 转HLS常见参数

        FFmpeg中自带HLS的封装参数,使用HLS格式即可进行HLS的封装,但是生成HLS的时候有各种参数可以进行参考,例如设置HLS列表中切片的前置路径、生成HLS的TS切片时设置TS的分片参数、生成HLS时设置M3U8列表中保存的TS个数等,详细参数如下表。

参数类型说明
start number整数设置M3U8列表中的第一片的序列数
hls time浮点数设置每一片时长
hls list size整数设置M3U8中分片的个数
hls ts options字符串设置TS 切片的参数
hls wrap整数设置切片索引回滚的边界值
hls allow cache整数设置M3U8中EXT-X-ALLOW-CACHE的标签
hls base url字符串设置M3U8中每一片的前置路径
hls segment filename字符串设置切片名模板
hls key info file字符串设置M3U8加密的key 文件路径
hls subtitle path字符串设置M3U8字幕路径
hls flags标签(整数)

设置M3U8文件列表的操作,具体如下。

singlefile:生成一个媒体文件索引与字节范围

delete_segments:删除M3U8文件中不包含的过期的TS切片文件

rounddurations:生成的M3U8切片信息的 duration 为整数

discont_start:生成M3U8的时候在列表前边加上 discontinuity 标签

omit endlist:在M3U8末尾不追加endlist标签

use localtime布尔设置M3U8文件序号为本地时间戳
use localtime mkdir布尔根据本地时间戳生成目录
hls playlist type字符串设置M3U8列表为事件或者点播列表
method字符串设置HTTP属性

四、视频切片加密

1.生成ASE加密文件

基本命令:

#!/bin/sh
openssl rand 16 > file.key
echo file.key > file.keyinfo
echo file.key >> file.keyinfo
echo $(openssl rand -hex 16) >> file.keyinfo

参数详解:

openssl rand 16 > file.key 生成一个key文件

echo file.key > file.keyinfo 将外部访问的file.key映射到file.keyinfo文件中。

echo file.key >> file.keyinfo 将项目file.key所在的文件路径映射到fike.keyinfo文件中。

echo $(openssl rand -hex 16) >> file.keyinfo 生成IV密钥

Go实现:

# 生成 file.key
err = exec.Command("sh", "-c", "openssl rand 16 > file.key").Run()
if err != nil {
    // todo
}
# 生成 file.keyinfo
err = exec.Command("sh", "-c", "echo file.key > file.keyinfo" && echo echo file.key >> file.keyinfo && echo $(openssl rand -hex 16) >> file.keyinfo").Start()
if err != nil {
    // todo
}
 
备注:Run():启动指定的命令并等待其完成。 Start():启动指定的命令无需等待其完成。

2.FFmpeg 创建 HLS 播放清单(m3u8)

转化命令:

ffmpeg -y -i ocean.mp4 -c:v copy -hls_time 10 -hls_list_size 0 -hls_key_info_file file.keyinfo -hls_playlist_type vod -hls_segment_filename ocean%d.ts -f hls playlist.m3u8

参数详解:

-y  覆盖输出的文件

-i ocean.mp4 输入文件,源文件;

-c:v copy 表示不重新编码,在格式未改变的情况采用;

-hls_time 10 每片 TS 文件时长10秒;

-hls_list_size 0  不限制M3U8中分片的个数;

-hls_key_info_file file.keyinfo file.keyinfo  设置M3U8加密的 key 文件路径;

-hls_playlist_type vod  设置 M3U8 列表为点播;

-hls_segment_filename ocean%d.ts  设置切片名模板;

-f hls playlist.m3u8 指定输出格式hls,playlist.m3u8 输出文件名

Go实现:

cmd := exec.Command("ffmpeg",
    "-y",
    "-i", ocean.mp4,
    "-c:v", "copy",
    "-hls_time", "10",
    "-hls_list_size", "0",
    "-hls_key_info_file", file.keyinfo,
    "-hls_playlist_type", "vod",
    "-hls_segment_filename", "ocean%d.ts",
    "-f", "hls", "playlist.m3u8"))
 
err = cmd.Start()
if err != nil {
    // todo
}
 
err = cmd.Wait()
if err != nil {
    // todo
}
 
// todo
 
备注:cmd.Start():Start启动指定的命令,但不等待它完成。cmd.Wait():等待命令退出并等待任何复制到stdin或从stdout或stderr复制完成;这里用 Wait() ,是我后面有业务处理,需要确认这里成功执行。

执行结果:

五、VideoJS + M3U8 播放视频

本地搭建一个简单的Web服务,并解析一个虚拟域名"www.test.vip"(IP+端口也可以),将生成的 file.key 、playlist.m3u8 和视频切片 TS 文件放在 resource 目录下(只要能访问到即可)
前端代码和目录:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>PC HLS video</title>
    <link href="https://vjs.zencdn.net/7.20.3/video-js.css" rel="stylesheet"/>
</head>
<body style="text-align:center;">

<h1>PC 端播放 HLS(<code>.m3u8</code>) 视频</h1>
<p>借助 video.js 和 videojs-contrib-hls</p>
<p>由于 videojs-contrib-hls 需要通过 XHR 来获取解析 m3u8 文件, 因此会遭遇跨域问题, 请设置浏览器运行跨域</p>

<video id="video" class="video-js vjs-default-skin vjs-big-play-centered" controls style="margin: auto">
    <source src="resource/playlist.m3u8" type="application/x-mpegURL">
</video>
<script src="https://vjs.zencdn.net/7.20.3/video.min.js"></script>
<!-- PC 端浏览器不支持播放 hls 文件(m3u8), 需要 videojs-contrib-hls 来给我们解码 -->
<script src="https://unpkg.com/videojs-contrib-hls/dist/videojs-contrib-hls.js"></script>
<script>
    const player = videojs('video');
    player.play();
</script>
</body>
</html>

 

 运行结果:

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公共用房管理系统有哪些管理功能?

数图互通房产管理 数图互通公共用房管理系统的管理功能范围包括: 1、对全部公房进行图形化、电子化、规范、动态化管理。 2、房屋数据定义:可对校区、片区、建筑物、楼层、房间数据进行增删改查&#xff0c;对房间属性数据进行批量修改。 3、档案及多类型附件管理:可对房产的…

对antd-vue输入框的二次封装,显示长度限制,兼容v-decorator和v-model

背景&#xff1a;antd组件中输入框长度限制没有显示&#xff0c;不能像elementUI一样&#xff0c;所以自己来封装实现 目的&#xff1a;对antd-vue输入框的二次封装&#xff0c;显示长度限制&#xff0c;兼容v-decorator和v-model 效果图&#xff1a; 代码&#xff1a; <…

JAVA方向程序设计PTA期末考试小测试

目录 1.方法重载 2.实例成员与类成员 3.static类成员 4.对象的组合 5. 对象的先上转型 6.引用类型&#xff08;数组&#xff09;参数传递 7.三角形类 8.机动车类补全代码 9.数组的引用与元素 10.求最大值 11.接口回调 12*.接口实现-Comparable 13.集体评分 14. 动…

@Windows server 2022安装使用(Workstation)

文章目录1.windows [iso下载](https://www.microsoft.com/zh-cn/evalcenter/evaluate-windows-server-2022)2.准备[workstation](https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html)&#xff08;个人测试&#xff09;3.安装windows server4.wi…

QT 使用第三方库QtXlsx操作Excel表

一直以来&#xff0c;都想学习一下C/C如何操作excel表&#xff0c;在网上调研了一下&#xff0c;觉得使用C/C去操作很麻烦&#xff0c;遂转向QT这边&#xff1b;QT有一个自带的类QAxObject&#xff0c;可以使用他去操作&#xff0c;但随着了解的深入&#xff0c;觉得他并不是很…

打造企业数智化管理新引擎,中国首份指标中台市场研究报告重磅发布!

12月15日&#xff0c;中国首份指标中台市场研究报告正式对外发布。该报告由专注数字化市场的研究咨询机构爱分析联合指标中台代表厂商 Kyligence 共同打造&#xff0c;内容聚焦指标管理和数据分析痛点&#xff0c;全面地梳理了指标中台概念、价值和应用落地方法论&#xff0c;并…

如何快乐地自学Python?阿里讲师用“四点”,说透快乐学习的方法

前言 由于我是自学Python&#xff0c;非科班出身&#xff0c;所以只能分享一些关于我的学习心得&#xff0c;如果有不对地方欢迎指正。 不过非科班出身虽然是一个痛点&#xff0c;但是在工作上&#xff0c;我其实不输给我其他同事&#xff0c;这点我倒是很有自信&#xff0c;…

活用 F12 开发者工具,测试效率原来可以提高这么多

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 从功能测试进阶自动化测试&#xff0c;熬夜7天整理出这一份超全学习指南【附网盘资源】 什么是F12? F12开发者工具是…

HTTP详细介绍

HTTP 内容协商 什么是内容协商 在 HTTP 中&#xff0c;内容协商是一种用于在同一 URL 上提供资源的不同表示形式的机制。内容协商机制是指客户端和服务器端就响应的资源内容进行交涉&#xff0c;然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方…

FS32R294JCK0MJDT功能、FS32R294KCK0MJDT特点、FS32R294KAK0MJDT雷达微控制器

S32R294的特点与优势&#xff1a;内置雷达信号加速单元&#xff0c;简称SPT2.8&#xff0c;是专门服务于FMCW雷达的信号处理加速单元。同时&#xff0c;它是16纳米Power架构的处理器&#xff0c;与上一代处理器有非常好的软件兼容性&#xff0c;软件复用率高达80%&#xff1b;S…

【愚公系列】2022年12月 使用NSSM工具部署ELK三件套为Windows服务

文章目录前言一、使用NSSM工具部署ELK三件套为Windows服务1.安装ElasticSearch服务2.安装Kibana服务3.安装Logstash服务4.验证ELK服务前言 nssm是一个服务封装程序&#xff0c;它可以将普通exe程序封装成服务&#xff0c;实现开机自启动&#xff0c;同类型的工具还有微软自己的…

计算机硬件基础

目录 一、计算机组成原理 1.计算机的组成 输入设备&#xff1a; 输出设备&#xff1a; 存储器&#xff1a; 运算器&#xff1a; 控制器&#xff1a; 2.总线 总线 DMA总线 二、多级存储 1.三级存储结构 Cache 主存储器 辅助存储器 2.地址空间 三、CPU工作原理概述…

Java培训Mycat全局序列

全局序列 1、本地文件方式 不推荐&#xff0c;如在Mycat主机中用本地文件方式创建全局序列&#xff0c;当这台机器宕机时会出现&#xff0c;序列文件丢失&#xff0c;造成序列冲突问题 Java培训Mycat全局序列 2、数据库方式 2.1、原理 利用数据库一个表 来进行计数累加。…

干货 | 数字经济创新创业——软件研究

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

计算机毕设Python+Vue校园食堂订餐系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【IntelliJ IDEA技巧】:如何生成.jar文件

问题描述&#xff1a; 由于上交给上级或者特殊使用&#xff0c;我们需要将jar文件提交给上级&#xff0c;那就是要学会如何生成jar文件&#xff0c;个人找了很久解决了问题&#xff0c;主要是网上太多参差不齐的回答&#xff0c;我觉着很浪费时间&#xff0c;当然有些也是比较好…

MySQL zip安装包 的安装过程

以前怎么安装的Mysql已经不记得了&#xff0c;感觉就是傻瓜式安装。这次又要用上了&#xff0c;发现和原先的记忆完全不一样了&#xff0c;也许是自己全忘了。这次记在这里&#xff0c;日后好参照&#xff0c;有需要的同学也可直接拿去。 1.下载&#xff0c;直接去官网吧 MyS…

人乳铁蛋白ELISA试剂盒操作注意事项及步骤丨艾美捷方案

人乳铁蛋白(LTF)ELISA试剂盒操作注意事项&#xff1a; 1.试剂应按标签说明书储存&#xff0c;使用前恢复到室温。稀稀过后的标准品应丢弃&#xff0c;不可保存。 2.实验中不用的板条应立即放回包装袋中&#xff0c;密封保存&#xff0c;以免变质。 3.不用的其它试剂应包装好…

基于Python+sqlite3实现(Web)图书管理系统【100010049】

*项目名称&#xff1a;图书管理系统 &#xff08;LibraryManagementSystem&#xff09; 一、系统目标 使用了Python作为语言,以django为后台&#xff0c;sqlite3作为数据库&#xff0c;UI基于bootstrap的图书管理系统&#xff0c;模拟图书管理的真实场景&#xff0c;考虑客观…

软件测试就业现状分析,2023是卷or润?

导读 自媒体大V卢克文11月的文章《从数据读疫情》中写道&#xff0c;“大约从2022年5月以后&#xff0c;身边的人&#xff0c;大量倾诉&#xff0c;他们的餐馆、旅行社、投资公司、运输公司出问题了&#xff0c;他们没钱了&#xff0c;每日还要还贷&#xff0c;他们很难过”。…