Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TS拼合后顺序错乱 #7

Open
transmixer opened this issue Apr 2, 2021 · 5 comments
Open

TS拼合后顺序错乱 #7

transmixer opened this issue Apr 2, 2021 · 5 comments

Comments

@transmixer
Copy link

应该是用了字典和os.listdir()的缘故?隐含的假设是原始M3U8里的TS文件按文件名顺序排列,但实际情形未必如此

@transmixer
Copy link
Author

transmixer commented Apr 2, 2021

应该是用了字典和os.listdir()的缘故?隐含的假设是原始M3U8里的TS文件按文件名顺序排列,但实际情形未必如此

搞错了,看了下原始m3u8文件名,确实是按顺序排列的。
可能是我在win下用Hyper-V虚拟机+powershell(multipass)的缘故,os.listdir().sort()的排序是1, 10, 11, 12, ... 19, 2, 20, ...
所以应该不是源代码的问题。

@transmixer
Copy link
Author

应该是用了字典和os.listdir()的缘故?隐含的假设是原始M3U8里的TS文件按文件名顺序排列,但实际情形未必如此

搞错了,看了下原始m3u8文件名,确实是按顺序排列的。
可能是我在win下用Hyper-V虚拟机+powershell(multipass)的缘故,os.listdir().sort()的排序是1, 10, 11, 12, ... 19, 2, 20, ...
所以应该不是源代码的问题。

应该还是filesList.sort()的问题,sort()方法的排序不是自然排序,文件名序号未补零的话就会排序错乱。
解决思路也有,安装natsort模块,使用natsort.natsorted()方法,但新安装一个模块会不会太过小题大作……

@cuba3
Copy link
Member

cuba3 commented Apr 7, 2021

应该是用了字典和os.listdir()的缘故?隐含的假设是原始M3U8里的TS文件按文件名顺序排列,但实际情形未必如此

搞错了,看了下原始m3u8文件名,确实是按顺序排列的。
可能是我在win下用Hyper-V虚拟机+powershell(multipass)的缘故,os.listdir().sort()的排序是1, 10, 11, 12, ... 19, 2, 20, ...
所以应该不是源代码的问题。

应该还是filesList.sort()的问题,sort()方法的排序不是自然排序,文件名序号未补零的话就会排序错乱。
解决思路也有,安装natsort模块,使用natsort.natsorted()方法,但新安装一个模块会不会太过小题大作……

已更新

@cuba3
Copy link
Member

cuba3 commented Apr 7, 2021

应该是用了字典和os.listdir()的缘故?隐含的假设是原始M3U8里的TS文件按文件名顺序排列,但实际情形未必如此

搞错了,看了下原始m3u8文件名,确实是按顺序排列的。
可能是我在win下用Hyper-V虚拟机+powershell(multipass)的缘故,os.listdir().sort()的排序是1, 10, 11, 12, ... 19, 2, 20, ...
所以应该不是源代码的问题。

应该还是filesList.sort()的问题,sort()方法的排序不是自然排序,文件名序号未补零的话就会排序错乱。
解决思路也有,安装natsort模块,使用natsort.natsorted()方法,但新安装一个模块会不会太过小题大作……

新增request header兼容部分网站修复404错误,新增一层无m3u8后缀名兼容,新增AES加密key绝对地址兼容,新增downloadBaseNameList合并兼容,部分请求改用post增加稳定性

@cuba3
Copy link
Member

cuba3 commented Apr 7, 2021

应该是用了字典和os.listdir()的缘故?隐含的假设是原始M3U8里的TS文件按文件名顺序排列,但实际情形未必如此

搞错了,看了下原始m3u8文件名,确实是按顺序排列的。
可能是我在win下用Hyper-V虚拟机+powershell(multipass)的缘故,os.listdir().sort()的排序是1, 10, 11, 12, ... 19, 2, 20, ...
所以应该不是源代码的问题。

应该还是filesList.sort()的问题,sort()方法的排序不是自然排序,文件名序号未补零的话就会排序错乱。
解决思路也有,安装natsort模块,使用natsort.natsorted()方法,但新安装一个模块会不会太过小题大作……

已更新

是有点小题大做,直接在源m3u8 .tsDic生成的时候,保存一个有序downloadBaseNameList

print("对字典进行排序生成downloadBaseNameList用于兼容不同系统文件排序")
        for beginTime in sorted(self.tsDic.keys()):
            self.downloadBaseNameList.append(os.path.basename(self.tsDic[beginTime]['file']))

在merge2Mp4增加一个非空判断就执行,同时也方便其他地方调用该方法,有的m3u8ts会损坏,下载失败,可在这里自行添加忽略判断

    def merge2Mp4(self, path, name='new'):
        if self.downloadBaseNameList:
            # 用于全流程直接使用
            filesList = self.downloadBaseNameList
        else:
            # 用于外部调用指定文件夹
            filesList = os.listdir(path)
            filesList.sort()
        os.chdir(path)
        files = ''
        # 部分下载文件可在此判断是会否成功,比如小于1KB忽略后合并

        for i in filesList:
            files += i + ' '
        cmd = 'cat ' + files + '> ' + name + '.tmp'
        os.system(cmd)
        os.system('rm -rf *.ts')
        os.system('rm -rf *.mp4')
        os.rename(name + ".tmp", name + ".mp4")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants
@transmixer @cuba3 and others