当前位置:网站首页>Local broadcast MSE fragments mp4 service
Local broadcast MSE fragments mp4 service
2022-08-02 19:33:00 【Technical Notes from HUI】
To test the browserMSE的多媒体框架,搭建一个MSEService will be much more convenient,这里记录下fragment mp4服务的搭建过程.
生成fragment mp4
下载安装bento4
Bento4是一个C++类库和工具,用于读取和写入ISO-MP4文件.除了支持ISO-MP4外,Bento4Parsing and reuse are also supportedH.264和H.265 ES流,将ISO-MP4转换为MPEG2-TS,打包HLS和MPEG-DASH、CMAF、内容加密、解密等.
# http://zebulon.bok.net/Bento4/binaries/
wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-639.x86_64-unknown-linux.zip
unzip Bento4-SDK-1-6-0-639.x86_64-unknown-linux.zip
cd Bento4-SDK-1-6-0-639.x86_64-unknown-linux/
# 直接放到/usr目录下
sudo cp * /usr/. -rf
输入mp4,tab键补全,可以看到,可用的binarycan be found:
$ mp4
mp42aac mp42hevc mp42ts mp4dash mp4dcfpackager
mp4dump mp4encrypt mp4fragment mp4iframeindex mp4mux
mp4split mp42avc mp42hls mp4compact mp4dashclone
mp4decrypt mp4edit mp4extract mp4hls mp4info
mp4rtphintinfo mp4tag
转换mp4为fragment mp4
使用mp4fragment,将普通mp4转换为fragment mp4,不指定--fragment-duration,生成的fragment duration按default值:
$ mp4fragment video.mp4 fragmented-default.mp4
found regular I-frame interval: 1511 frames (at 29.970 frames per second)
auto-detected fragment duration too large, using default
指定fragment时长为2s:
mp4fragment --fragment-duration 2000 video.mp4 fragmented.mp4
通过mp4info查看生成的fragmented.mp4文件信息,这时候fragments字段已经变成yes:
$ mp4info fragmented.mp4
File:
major brand: isom
minor version: 200
compatible brand: isom
compatible brand: iso2
compatible brand: avc1
compatible brand: mp41
compatible brand: iso5
fast start: yes
Movie:
duration: 97903 (media timescale units)
duration: 97903 (ms)
time scale: 1000
fragments: yes
fragment mp4分片
对fragment mp4进行分片:
$ mp4dash fragmented.mp4
Parsing media file 1: fragmented.mp4
WARNING: video segment durations for "File 1#1" vary by more than 10% (consider using --use-segment-timeline)
Splitting media file (video) fragmented.mp4
分片完成后,没有指定output-dir参数,会生成output目录:
$ cd output/video/avc1
$ ls
init.mp4 seg-11.m4s seg-13.m4s seg-15.m4s seg-17.m4s seg-19.m4s
seg-20.m4s seg-22.m4s seg-3.m4s seg-5.m4s seg-7.m4s seg-9.m4s
seg-10.m4s seg-12.m4s seg-14.m4s seg-16.m4s seg-18.m4s seg-1.m4s
seg-21.m4s seg-2.m4s seg-4.m4s seg-6.m4s seg-8.m4s
配置mse-demo
新建4k.html文件,修改baseUrl,templateUrl字段,放到nginx服务的目录下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>MSE Demo</title>
</head>
<body>
<h1>MSE Demo</h1>
<div>
<video controls width="80%"></video>
</div>
<script type="text/javascript"> (function() {
var baseUrl = 'http://192.168.31.124/dash/output/video/avc1/'; var initUrl = baseUrl + 'init.mp4'; var templateUrl = baseUrl + 'seg-$Number$.m4s'; var sourceBuffer; var index = 1; var numberOfChunks = 22; var video = document.querySelector('video'); if (!window.MediaSource) {
console.error('No Media Source API available'); return; } var ms = new MediaSource(); video.src = window.URL.createObjectURL(ms); ms.addEventListener('sourceopen', onMediaSourceOpen); function onMediaSourceOpen() {
sourceBuffer = ms.addSourceBuffer('video/mp4; codecs="avc1.4d401f"'); sourceBuffer.addEventListener('updateend', nextSegment); GET(initUrl, appendToBuffer); video.play(); } function nextSegment() {
var url = templateUrl.replace('$Number$', index); GET(url, appendToBuffer); index++; if (index > numberOfChunks) {
sourceBuffer.removeEventListener('updateend', nextSegment); } } function appendToBuffer(videoChunk) {
if (videoChunk) {
sourceBuffer.appendBuffer(new Uint8Array(videoChunk)); } } function GET(url, callback) {
var xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.responseType = 'arraybuffer'; xhr.onload = function(e) {
if (xhr.status != 200) {
console.warn('Unexpected status code ' + xhr.status + ' for ' + url); return false; } callback(xhr.response); }; xhr.send(); } })(); </script>
</body>
</html>
播放测试
$ google-chrome http://192.168.31.124/mse-demo/4k.html
- https://github.com/hongszh/mse-demo
边栏推荐
猜你喜欢

navicat premium 15 下载安装详细教程
![[300+ selected big factory interview questions continue to share] Big data operation and maintenance sharp knife interview questions column (10)](/img/cf/44b3983dd5d5f7b92d90d918215908.png)
[300+ selected big factory interview questions continue to share] Big data operation and maintenance sharp knife interview questions column (10)

npm install报错Fix the upstream dependency conflict, or retry

2022高压电工特种作业证考试题库及答案

打补丁的日子,比写代码的日子难熬多了

FP6606CLP5 SOP-8 USB Type-C和PD充电控制器

Mysql应用安装后找不到my.ini文件

Redis的介绍和使用

Flink Learning 9: Configure the idea to develop the flink-Scala program environment

SQL Statement Basics
随机推荐
H5网页播放器EasyPlayer.js播放器界面的加载效果无法消失是什么原因?
npm install报错Fix the upstream dependency conflict, or retry
Arduino hardware programming introduction to language learning
二舅“反转”了?
【21天学习挑战赛学习打卡】顺序查找
Common software silent installation parameters
Mysql应用安装后找不到my.ini文件
navicat创建连接 2002-can‘t connect to server on localhost(10061)且mysql服务已启动问题
【电子器件笔记7】MOS管参数和选型
持续集成(五)Jenkins配置父子job
Continuous integration (4) Jenkins configuration alarm mechanism
土巴兔IPO五次折戟,互联网家装未解“中介”之痛
动力电池扩产潮,宁德时代遭围剿
蔚来杯2022牛客暑期多校训练营5 ABCDFGHK
H.265视频流媒体播放器EasyPlayer.js集成时报错“SourceBuffer ”如何解决?
Flink Learning 9: Configure the idea to develop the flink-Scala program environment
边界访问的空间权限
罗敏背后是抖音
Real-time data warehouse architecture evolution and selection
golang学习之七:并发编程基础(goroutine、channel、select)