根据TS切片文件还原M3U8列表
起因
在搭建的nginx服务器上面添加了一个直播用的模块,然而由于配置错误的原因导致直播流HLS播出后只保留了最后几个切片的目录(TS文件依旧还在),通过手动播放对应的ts文件依旧能够正常播放,但是对应的目录却丢失了。
解决方案
在linux系统下面保存下方的命令为一个可执行的sh文件,然后确认一下对应的文件数量,输入文件名+数量,然后会输出到屏幕上对应的文件列表。
备注:需要提前安装mediainfo相关的组件哦~(最重要的就是这个了)
#!/bin/bash
if [ "$1" = "" ];then
echo "No count to check";
exit;
fi
filedir=`pwd`;
cd ${filedir}
#file tag start
echo "#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:499
#EXT-X-TARGETDURATION:6
#EXT-X-PLAYLIST-TYPE";
#not the true max lenth, it just a number to store the next file number part
maxLenth=0
#fileList = ls ${workDir} | grep ${fileType}
for (( ; ${maxLenth}<=$1 ; maxLenth++ ));
do
#echo `mediainfo ${Location}"/"${maxLenth}".ts"|awk '$1=="Duration" {print $0}'`
file=`mediainfo ${maxLenth}".ts"|grep "Duration"|awk ' \
{ if ($5<100)
print $3".0"$5
else
print $3"."$5
} '|awk 'NR==2{print $0}'|awk ' {print "#EXTINF:"$0+0.033 }'`
echo ${file}
echo ${maxLenth}.ts
done
#end file tag
echo "#EXT-X-ENDLIST"
原理
其实原理很简单,既然每一个TS切片文件都存在,只要我们能够获取对应的文件信息(编码信息),就能还原出对应的列表(主要是因为M3U8列表的TS切片不是完全时间统一的,会有一些小小的时间差别)
Mediainfo会正确的获取视频切片的长度信息,通过awk直接提取出需要的内容,然后在整理成需要的文件路径和文件长度信息,最后添加上视频播列表放头和视频列表播放尾就完成了恢复!
——分割线——
covert ts file to m3u8 list
collect ts file to m3u8 list file
根据ts切片还原m3u8列表
留言