根据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列表

最后修改日期:2020年5月11日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。