使用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')