Python+FFmpeg/CMD根据m3u8合并ts文件

28 阅读2分钟

出处不详,原版忘记在哪里找到的了,已做修改

首先说一下注意事项:

  • 手机直接连在电脑上,可以复制文件,但是不能够通过命令行访问。其原因大概是没有挂载盘符,导致其路径一直在/此电脑下面。

  • 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的实际路径
# 然后在该文件夹下进入命令行,一行命令即可

一些参考文献:

windows窗口命令——(copy/b)文件无缝拼接隐藏

(copy/b)无缝拼接命令+实例应用