admin管理员组

文章数量:1660207

使用ffmpeg进行拼接是下载网络流媒体的利器

但是最近发现,有多个资源站拉出的m3u8文件中,ts分片比较奇怪

从链接上看,这些分片没有传统的ts后缀,例如:

#EXTINF:6.269,
xxxxxxx2189/651d236eec8b4d20a625d482d91bfde5

手动下载会发现chrome中默认以图片格式打开

保存到本地,给其增加后缀.ts后,QuickTime可以正常播放

但使用ffprobe分析,发现识别为png,进而导致无法拼接,分析结果如下

[png_pipe @ 0x557934e58080] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, png_pipe, from 'test.ts':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: png, rgba(pc), 1x1, 25 tbr, 25 tbn, 25 tbc
[FORMAT]
filename=test.ts
nb_streams=1
nb_programs=0
format_name=png_pipe
format_long_name=piped png sequence
start_time=N/A
duration=N/A
size=8144042
bit_rate=N/A
probe_score=99
[/FORMAT]

使用Hexeditor打开后,发现文件头被描述为了PNG

在这种情况下,只需要将其中PNG文件头部分全部使用FF填充,即可处理该问题

填充后的效果如图

 批量代码处理的方案

判断文件开头为 89 50 4E 47 -〉说明被伪装成了PNG

 一直填充FF到 47 40    -〉从这边开始就是TS文件的内容了

更新:

最新发现,只要填充89 50 4E 47四个值就可以

需要注意:

        不可以直接删除这一段,直接删除后ffprobe提示如下错误

123.ts: Invalid data found when processing input

使用TS分析工具会提示

no valid synchronize byte found

例子代码:

# 解析伪装成png的ts
def resolve_ts():
    for i in range(1695):
        origin_ts = 'temp_file/' + str(i) + '.ts'
        resolved_ts = 'resolve_file/' + str(i) + '.ts'

        infile = open(origin_ts, "rb")  # 打开文件
        outfile = open(resolved_ts, "wb")  # 内容输出
        data = infile.read()
        outfile.write(data)
        outfile.seek(0x00)
        outfile.write(b'\xff\xff\xff\xff')
        outfile.flush()
        infile.close()  # 文件关闭
        outfile.close()
        print('resolve ' + origin_ts + ' success')

本文标签: 后缀不包含分片近期网站