鱼C论坛

 找回密码
 立即注册
查看: 152|回复: 2

[已解决]爬虫m3u8文件合并为mp4文件

[复制链接]
发表于 2024-12-10 14:30:03 | 显示全部楼层 |阅读模式
10鱼币
def merge_ts():
    lst=[]
    with open("哲仁王后",mode="r",encoding="utf-8")as f:
        for line in f:
            if line.startswith("#"):
                continue
            line = line.strip().split("/")[-1]
            lst.append(f"video/{line}")
    s="+".join(lst)
    #print(s)#video/o68eRrXg.ts+video/KuX3T8rF.ts~~~
    os.system(f"copy/b {s} movie.mp4")
    print("搞定")
merge_ts()

video文件中.ts可以观看也可以正常读出,代码执行也到“搞定”,但是pycharm目录没看到MP4文件。
广大网友这是哪里的问题?????
最佳答案
2024-12-10 14:30:04
本帖最后由 jackz007 于 2024-12-13 17:05 编辑

        代码没有逻辑和语法问题,只是在 .ts 片段文件太多的情况下,有可能导致 Copy 命令行过长,一旦超出限度,会导致命令失效。还有一个问题,像这样通过直接合并 ts 片段得到的文件仍然是 .ts 格式,并非 .mp4  格式。
        楼主可以试试这个代码,基本上继承自楼主的代码,只不过加入了片段文件检测,并且,把原来的一个单独命令行分解为多个,每次操作只合并不超过 4 个片段文件:  
import os

'''
    所有的 ts 片段文件已经全部下载完成,ts 文件保持原始名称,所有的 ts 文件位于 video 子目录内。
'''

def merge_ts(fn1 , fn2) :
    with open(fn1 , mode = 'r' , encoding = 'utf-8') as fp :
        lst = []
        for line in fp . read() . split('\n') :
            if line and not line . startswith('#') :
                ts = 'video\\' + line . split('/')[-1]
                if os . path . exists(ts) :
                    lst . append(ts)
                else :
                    print('\n【失败】:ts 文件 [%s] 不存在!\n' % ts)
                    break
        else :
            if lst :
                fp = open(fn2 , 'wb')
                fp . close()
                n = 4
                for k in range(0 , len(lst) , n) :
                    d = n if k + n < len(lst) else len(lst) - k
                    x = '+' . join([lst[k + i] for i in range(d)])
                    cmd = 'Copy/b %s+%s %s' % (fn2 , x , fn2)
                    print(cmd)
                    os . system(cmd)
                print('\n【成功】:输出文件为 [%s]\n' % fn2)

merge_ts('哲仁王后' ,  'movie.ts')
        
        以后下载视频文件的时候,为 ts 文件重新命名,在文件名称中加入足以体现前后顺序的数字编号,这样的话,合并文件就会变得十分简单,在 CMD 窗口内,一条命令即可搞定:
Copy/b *.ts movie.ts

        当然,直接用 Python 代码拼接是最为简单的
import os

'''
    所有的 ts 片段文件已经全部下载完成,ts 文件保持原始名称,所有的 ts 文件位于 video 子目录内。
'''

def merge_ts(fn1 , fn2) :
    with open(fn1 , mode = 'r' , encoding = 'utf-8') as fp :
        stream = b''
        for line in fp . read() . split('\n') :
            if line and not line . startswith('#') :
                ts = 'video\\' + line . split('/')[-1]
                if os . path . exists(ts) :
                    with open(ts , 'rb') as fp2
                        stream += fp2 . read()
                else :
                    print('\n【失败】:ts 文件 [%s] 不存在!\n' % ts)
                    break
        else :
            if stream :
                with open(fn2 , 'wb') as fp2 :
                    fp2 . write(stream)
                print('\n【成功】:输出文件为 [%s]\n' % fn2)

merge_ts('哲仁王后' ,  'movie.ts')

最佳答案

查看完整内容

代码没有逻辑和语法问题,只是在 .ts 片段文件太多的情况下,有可能导致 Copy 命令行过长,一旦超出限度,会导致命令失效。还有一个问题,像这样通过直接合并 ts 片段得到的文件仍然是 .ts 格式,并非 .mp4 格式。 楼主可以试试这个代码,基本上继承自楼主的代码,只不过加入了片段文件检测,并且,把原来的一个单独命令行分解为多个,每次操作只合并不超过 4 个片段文件: 以后下载视频 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-10 14:30:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-12-13 17:05 编辑

        代码没有逻辑和语法问题,只是在 .ts 片段文件太多的情况下,有可能导致 Copy 命令行过长,一旦超出限度,会导致命令失效。还有一个问题,像这样通过直接合并 ts 片段得到的文件仍然是 .ts 格式,并非 .mp4  格式。
        楼主可以试试这个代码,基本上继承自楼主的代码,只不过加入了片段文件检测,并且,把原来的一个单独命令行分解为多个,每次操作只合并不超过 4 个片段文件:  
import os

'''
    所有的 ts 片段文件已经全部下载完成,ts 文件保持原始名称,所有的 ts 文件位于 video 子目录内。
'''

def merge_ts(fn1 , fn2) :
    with open(fn1 , mode = 'r' , encoding = 'utf-8') as fp :
        lst = []
        for line in fp . read() . split('\n') :
            if line and not line . startswith('#') :
                ts = 'video\\' + line . split('/')[-1]
                if os . path . exists(ts) :
                    lst . append(ts)
                else :
                    print('\n【失败】:ts 文件 [%s] 不存在!\n' % ts)
                    break
        else :
            if lst :
                fp = open(fn2 , 'wb')
                fp . close()
                n = 4
                for k in range(0 , len(lst) , n) :
                    d = n if k + n < len(lst) else len(lst) - k
                    x = '+' . join([lst[k + i] for i in range(d)])
                    cmd = 'Copy/b %s+%s %s' % (fn2 , x , fn2)
                    print(cmd)
                    os . system(cmd)
                print('\n【成功】:输出文件为 [%s]\n' % fn2)

merge_ts('哲仁王后' ,  'movie.ts')
        
        以后下载视频文件的时候,为 ts 文件重新命名,在文件名称中加入足以体现前后顺序的数字编号,这样的话,合并文件就会变得十分简单,在 CMD 窗口内,一条命令即可搞定:
Copy/b *.ts movie.ts

        当然,直接用 Python 代码拼接是最为简单的
import os

'''
    所有的 ts 片段文件已经全部下载完成,ts 文件保持原始名称,所有的 ts 文件位于 video 子目录内。
'''

def merge_ts(fn1 , fn2) :
    with open(fn1 , mode = 'r' , encoding = 'utf-8') as fp :
        stream = b''
        for line in fp . read() . split('\n') :
            if line and not line . startswith('#') :
                ts = 'video\\' + line . split('/')[-1]
                if os . path . exists(ts) :
                    with open(ts , 'rb') as fp2
                        stream += fp2 . read()
                else :
                    print('\n【失败】:ts 文件 [%s] 不存在!\n' % ts)
                    break
        else :
            if stream :
                with open(fn2 , 'wb') as fp2 :
                    fp2 . write(stream)
                print('\n【成功】:输出文件为 [%s]\n' % fn2)

merge_ts('哲仁王后' ,  'movie.ts')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-10 14:30:17 | 显示全部楼层
看起来您的代码试图通过命令行将多个 `.ts` 文件合并成一个 `.mp4` 文件,但使用了 `copy/b` 命令。这个命令实际上只是在文件之间做一个简单的字节拼接,在某些情况下可能没法正确生成一个有效的 MP4 文件。

这里有几个可能的问题和建议:

1. **路径问题**:确保所有的 `.ts` 文件路径在 `video/` 文件夹内是正确的。

2. **命令问题**: `copy /b` 是 Windows 下的命令,运行该命令需要确保在 Windows 环境中执行,并且命令行的环境是正确的。

3. **合并方式不当**:简单拼接 `.ts` 文件可能无法生成有效的 `.mp4` 文件,尤其是在文件头部信息不一致的情况下。建议使用 FFmpeg 等专业工具来合并 `.ts` 文件。

4. **文件生成路径问题**:生成的 `movie.mp4` 文件会放在当前命令行的工作目录下,可以通过打印当前工作目录来检查:
import os
   print(os.getcwd())

建议使用 FFmpeg 合并:
import os

def merge_ts():
    with open("哲仁王后", mode="r", encoding="utf-8") as f:
        with open("file_list.txt", "w") as file_list:
            for line in f:
                if line.startswith("#"):
                    continue
                line = line.strip()
                file_list.write(f"file '{line}'\n")

    os.system("ffmpeg -f concat -safe 0 -i file_list.txt -c copy movie.mp4")
    print("搞定")

merge_ts()

**注意**:你需要安装并将 FFmpeg 添加到你的系统环境变量中,这样 `ffmpeg` 命令才能正常工作。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 09:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表