出处不详,原版忘记在哪里找到的了,已做修改
首先说一下注意事项:
-
手机直接连在电脑上,可以复制文件,但是不能够通过命令行访问。其原因大概是没有挂载盘符,导致其路径一直在
/此电脑下面。 -
FFmpeg的安装等不再赘述,我这里已经安装好了。而且这里的FFmpeg已经加入环境变量,即全局可调用。如果没有加入环境变量,则需要通过安装路径/ffmpeg.exe或者进入安装文件夹,通过.\ffmpeg.exe来调用
应该是两个思路:
-
删掉m3u8当中的ts文件路径,拼接文件名,然后用CMD的bat命令
copy /b将这些文件合并,设定输出格式为MP4 -
更改m3u8当中的ts文件路径为实际路径,然后用FFmpeg一行命令合并
第一种方式如下:
import os
import threading
import time
import json
# 读取m3u8文件
def read_file():
f=open('D:/X-code/download/video/index.m3u8')
text_list=f.readlines()
files = []
for i in text_list:
if i.find('#EX')==-1:
#有#EXfind返回0,无-1
files.append(i)
# 收集ts文件路径和在视频当中对应的位置
f.close()
tmp = []
for file in files[0:len(files)]:
tmp.append(file.replace("\n","").replace("/storage/emulated/download/video_35222/",""))
# 删掉ts文件的路径
os.chdir("D:/X-code/download/video/")
# 用于改变当前工作目录到指定的路径
shell_str = '+'.join(tmp)
# 将处理结果连接起来
# 由于忘记那时候处理的文件的样子
# 所以此时并不清楚为何要将处理结果连接起来
# 似乎是为了生成FFmpeg的命令
return shell_str
# 返回生成的命令
def thread(shell_str):
time.sleep(2)
# windows窗口命令——(copy/b)文件无缝拼接隐藏
shell_str = 'copy /b ' + shell_str + ' 1.mp4'
# os模块中的system()函数可以方便地运行其他程序或者脚本
os.system(shell_str)
print('---子线程结束---')
# 好像是一个子线程的操作?
# 不太清楚,忘记当时是怎么处理的了
def gather():
shell_str=files=read_file()
# 读取文件,生成命令
t1 = threading.Thread(target=thread(shell_str))
# 执行命令
t1.setDaemon(True)
t1.start()
t1.join(timeout=1)
#不填就是等待子线程结束
# 似乎是为了将手机缓存的文件路径,改为电脑上的路径
def altpath():
f=open('D:/X-code/download/index.m3u8',mode='r')
text_list=f.readlines()
f.close()
tmp = []
for i in text_list:
tmp.append(i.replace("storage/emulated/download/video_35222/","D:/X-code/download/"))
f=open('D:/X-code/download/index.m3u8',mode='w')
f.writelines(tmp)
f.close()
if __name__ == "__main__":
altpath()
#gather()
第二种方式:
ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy 1.mp4
# 这个命令是用FFmpeg来合并
# 用FFmpeg的话,直接修改m3u8文件当中ts的实际路径
# 然后在该文件夹下进入命令行,一行命令即可
一些参考文献: