6-25 4,856 views
Bento4
Bento4是一个C ++类库和工具,旨在读取和写入ISO-MP4文件。此格式在国际规范ISO / IEC 14496-12、14496-14和14496-15中定义。该格式是Apple Quicktime文件格式的派生产品,因此Bento4也可用于读取和写入大多数Quicktime文件。除了支持ISO-MP4,Bento4还支持解析和复用H.264和H.265基本流,将ISO-MP4转换为MPEG2-TS,打包HLS和MPEG-DASH,内容加密,解密等等。
MPEG-DASH
基于HTTP的动态自适应流(英语:Dynamic Adaptive Streaming over HTTP,缩写DASH,也称MPEG-DASH)是一种自适应比特率流技术,使高质量流媒体可以通过传统的HTTP网络服务器以互联网传递。类似苹果公司的HTTP Live Streaming(HLS)方案,MPEG-DASH会将内容分解成一系列小型的基于HTTP的文件片段,每个片段包含很短长度的可播放内容,而内容总长度可能长达数小时(例如电影或体育赛事直播)。内容将被制成多种比特率的备选片段,以提供多种比特率的版本供选用。当内容被MPEG-DASH客户端回放时,客户端将根据当前网络条件自动选择下载和播放哪一个备选方案。客户端将选择可及时下载的最高比特率片段进行播放,从而避免播放卡顿或重新缓冲事件。也因如此,MPEG-DASH客户端可以无缝适应不断变化的网络条件并提供高质量的播放体验,拥有更少的卡顿与重新缓冲发生率。
MPEG-DASH是首个基于HTTP的自适应比特率流解决方案,它也是一项国际标准。[1]MPEG-DASH不应该与传输协议混淆——MPEG-DASH使用TCP传输协议。
MPEG-DASH使用现有的HTTP网络服务器基础设施。它允许如互联网电视、电视机顶盒、台式电脑、智能手机、平板电脑等设备消费通过互联网传送的多媒体内容(如视频、电视、广播等),并可应对变动的互联网接收条件。自适应流解决方案的标准化是为向市场提供信心,使该解决方案可以用于通用部署,抗衡类似但更专有的解决方案,如微软Smooth Streaming与Adobe的HDS。
不同于HLS、HDS和Smooth Streaming,DASH不关心编解码器,因此它可以接受任何编码格式编码的内容,如H.265、H.264、VP9等。[2]
安装bento4
$ wget http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
$ unzip Bento4-SDK-1-6-0-637.x86_64-unknown-linux.zip
# 重命名
$ mv Bento4-SDK-1-6-0-637.x86_64-unknown-linux bento4
# 移动到/usr/local/ 下
$ mv bento4 /usr/local/
bento4命令
mp4info - 显示有关MP4文件的高级信息,包括所有曲目和编解码器详细信息
mp4dump - 显示MP4文件的整个atom / box结构
mp4edit - 添加/插入/删除/替换MP4文件的原子/盒子项目
mp4extract - 从MP4文件中提取原子/盒子
mp4encrypt - 加密MP4文件(支持多种加密方案)
mp4decrypt - 解密MP4文件(支持多种加密方案)
mp4dcfpackager - 将媒体文件加密为OMA DCF文件
mp4compact - 将stsz表格转换成stz2表格以创建更紧凑的MP4文件
mp4fragment - 从非碎片化的文件创建碎片化的MP4文件。
mp4split - 将碎片化的MP4文件拆分为离散文件
mp4tag - 显示/编辑MP4元数据(iTunes样式和其他样式)
mp4mux - 将一个或多个基本流(H264,AAC)多路复用到MP4文件中
mp42aac - 从MP4文件中提取原始AAC基本流
mp42avc - 从MP4文件中提取原始AVC / H.264基本流
mp42hls - 将MP4文件转换为HLS(HTTP实时流)演示文稿,包括分段的生成和.m3u8播放列表以及AES-128和SAMPLE-AES(用于FairPlay)加密。这可以代替Apple的mediafilesegmenter工具。
mp42ts - 将MP4文件转换为MPEG2-TS文件。
mp4dash - 从一个或多个MP4文件创建MPEG DASH输出,包括加密。
mp4dashclone - 创建远程或本地MPEG DASH表示的本地克隆,可以选择在克隆段时对它们进行加密。
mp4hls - 从一个或多个MP4文件创建一个多比特率的HLS主播放列表,包括对加密和仅I帧播放列表的支持。这可以用作Apple的variantplaylistcreator工具的替代品。
转换mp4为MPEG-DASH
$ /usr/local/bento4/bin/mp4fragment test.mp4 video-fragmented.mp4
$ /usr/local/bento4/bin/mp4dash --use-segment-timeline video-fragmented.mp4
# output是输出文件
$ ll
drwxr-xr-x 4 root root 4096 Jun 25 07:03 output
-rw-r--r-- 1 root root 1396 Jun 25 07:09 test.html
-rwxr-xr-x. 1 root root 356253350 Jun 25 04:19 test.mp4
-rw-r--r-- 1 root root 355066482 Jun 25 06:58 video-fragmented.mp4
$ ll output
drwxr-xr-x 3 root root 4096 Jun 25 07:03 audio
-rw-r--r-- 1 root root 11382 Jun 25 07:03 stream.mpd
drwxr-xr-x 3 root root 4096 Jun 25 07:03 video
使用dplayer播放 mpd
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<!-- or -->
<script src="https://cdn.dashjs.org/v3.1.0/dash.all.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/shaka-player/3.0.1/shaka-player.compiled.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dplayer/1.25.1/DPlayer.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/hls.js@canary"></script>
</head>
<body>
<div id="dplayer" style="width:400px;"></div>
<script>
const dp = new DPlayer({
container: document.getElementById('dplayer'),
screenshot: true,
video: {
url: 'http://url/stream.mpd',
type: 'shakaDash',
customType: {
shakaDash: function (video, player) {
var src = video.src;
var playerShaka = new shaka.Player(video); // 将会修改 video.src
playerShaka.load(src);
},
},
},
});
console.log(dp.plugins.hls); // Hls 实例
</script>
</body>
</html>
如果出现 ls: cannot access /usr/lib/libstdc++.so.6: No such file or directory
gcc版本太老需要更新
升级到gcc 7.3:
$ yum -y install centos-release-scl
$ yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
$ scl enable devtoolset-7 bash
yum install devtoolset-7-libstdc++7
$ gcc --version
gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 7.3的话:
$ echo "source /opt/rh/devtoolset-7/enable" >>/etc/profile
# 更换新的libstdc
$ wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
$ unzip libstdc.so_.6.0.26.zip
# 我的是64系统
$ mv libstdc++.so.6.0.26 /usr/lib64/
# 查看老的libstdc指向
$ ls -l /usr/lib64/libstdc++.so.6
# 删除原来的指向
$ rm -rf /usr/lib64/libstdc++.so.6
# 设置软连接
$ ln -s /usr/lib64/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6
$ strings /usr/lib64/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_1.3.9
CXXABI_1.3.10
CXXABI_1.3.11
CXXABI_1.3.12
CXXABI_TM_1
CXXABI_FLOAT128
CXXABI_1.3
CXXABI_1.3.11
CXXABI_1.3.2
CXXABI_1.3.6
CXXABI_FLOAT128
CXXABI_1.3.12
CXXABI_1.3.9
CXXABI_1.3.1
CXXABI_1.3.5
CXXABI_1.3.8
CXXABI_1.3.4
CXXABI_TM_1
CXXABI_1.3.7
CXXABI_1.3.10
CXXABI_1.3.3