前言
先看一个视频:
https://2481asd.bj.bcebos.com/?url=https://2481.cdn.bcebos.com/m3u8File/41b89f46c3f3739f445237f18a2e4227/index_format.m3u8
这个视频引用了一个m3u8文件:https://2481.cdn.bcebos.com/m3u8File/41b89f46c3f3739f445237f18a2e4227/index_format.m3u8
其中引用了一些bmp文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00000.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00001.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00002.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00003.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00004.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00102.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00103.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00104.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00105.ts.bmp&app=2020
#EXTINF:2.000000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00106.ts.bmp&app=2020
#EXTINF:1.300000,
https://gimg2.baidu.com/image_search/src=2481.cdn.bcebos.com/m3u8/41b89f46c3f3739f445237f18a2e4227/bmpPath/index_00107.ts.bmp&app=2020
#EXT-X-ENDLIST
如果单独把这些图片拿出来看看呢?
依托使这图片
但其实你把它下载下来,改后缀为.ts,其实是能播放的!
原理
简单来讲,就是把bmp文件的字节头放在了ts文件之前,这样就会被认为是一张图片。而如上图雪花屏一般的样子则是ts文件的数据。
BMP字节头
BMP文件总共由四个部分构成:
(1)BMP文件头(bmp file header):提供文件的格式、大小等信息
(2)位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
(3)调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表,在使用 256位彩色、16位彩色等情况下用到
(4)位图数据(bitmap data):就是图像的像素数据
https://blog.csdn.net/weixin_39756273/article/details/110585675
看例子:
/*
BMP文件大小计算: ()14+40) + 长 * 宽 * 比特位深 / 8
*/
var header1 = '42 4D FF FF FF FF 00 00 00 00 36 00 00 00 28 00 ' //FF FF FF FF 图片总大小
var header2 = '00 00 58 02 00 00 FF FF FF FF 01 00 18 00 00 00 ' //分别是 int 高度 | short 比特/位深
var header3 = '00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 ' //FF FF FF FF 大小为图片总大小 - 54(54是字节头长度)
var header4 = '00 00 00 00 00 00'
第一行
40 4D 代表着 BM,是BMP文件的开头
第一行我用FF FF FF FF代替的是文件总大小,大小按照注释计算,即 视频总大小 + 54 。其中54是BMP文件头大小。
比如你有一份大小为 615,888 字节的ts文件,
- 615,,888 + 54字节 = 615,942 字节
- 转换成16进制 => 96606 补位一下 => 00096606 分隔一下 => 00 09 66 06
- <重要> 如果你看真正的BMP文件头,你会发现其中文件总大小的数据并不是正着看的,比如BMP图片总大小 615,942 字节,它显示的是 06 66 09 00 不是 00 09 66 06。很明显,这是倒过来了,所以 2. 获得的代表大小的数据需要倒过来 00 09 66 06 => 06 66 09 00
--
第二行
58 02 00 00代表着 宽度 为 600,高度需要按照ts文件大小算,都需要把结果倒过来,如 3.
--
第三行
FF FF FF FF 代表的是图片数据的大小,不包括 BMP字节头。即 ts文件的大小。按照上文说的方法弄即可
--
第四行
不用改。
在这之后就可以把改完的BMP文件头和ts数据buffer接上即可。
相关问题:
- 如果弄出来的图片打不开,你可以拖到浏览器看看,是不是有一条透明的部分(一般在最上面),如果有,说明你设置的宽高和ts的大小有差异,即ts文件的数据无法填充全图片,从而导致报错。
TS字节头
分析
TS层的packet都是固定等长的188字节包,由ts header、adaptation field、payload组成,其中ts header固定4个字节(32位);adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充;payload是pes数据。
————————————————
版权声明:本文为CSDN博主「andylao62」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/andylao62/article/details/120019483
无需改动
应用
应用我就不多说了,很广泛的。
如果你想要的成品,我写了一份,但是不公开。你可以找我要
猜想
说实话,我没动且没懂为什么加了BMP的字节头之后还能播放ts文件,只能说ts文件播放可能是检索到文件开始位置才会当做开头播放罢,就像图片压缩包一样,把图片和压缩包的buffer拼接一下。
结束语
说实话,探索这个的过程挺有意思的。再加上我上篇文章写的白嫖百度的图片服务器,就可以开零成本视频站了。