You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+FFmpeg合并Laftel的init.mp4与seg-*.m4s文件?

Laftel.net免费视频下载器的媒体文件合并问题

背景与已完成工作

我正在开发一款针对Laftel.net免费视频的下载器,该网站采用MPEG-DASH流媒体技术。通过Chrome开发者工具,我定位到了init.mp4初始化文件和seg-<number>.m4s分段媒体文件,目前已通过以下Python代码成功下载所有视频/音频的分段文件及对应初始化文件:

# 省略收集各.m4s文件请求URL的前置代码

# 变量"found"是请求URL的一部分
import os
import random
from time import sleep

def curl_m4s():
    for i in range(1,240): # .m4s分段文件固定为239个
        vid_url = f"https://mediacloud.laftel.net/{found}/video/avc1/2/seg-{i}.m4s"
        aud_url = f"https://mediacloud.laftel.net/{found}/audio/mp4a/eng/seg-{i}.m4s"
        
        if i < 10: # 处理个位数编号
            os.system(f"curl {vid_url} > {location}/vids/vid00{i}.m4s")
            os.system(f"curl {aud_url} > {location}/auds/aud00{i}.m4s")
            sleep(random.randint(1,3))
            
        elif i < 100: # 处理两位数编号
            os.system(f"curl {vid_url} > {location}/vids/vid0{i}.m4s")
            os.system(f"curl {aud_url} > {location}/auds/aud0{i}.m4s")
            sleep(random.randint(1,3))
            
        else: # 处理三位数编号
            os.system(f"curl {vid_url} > {location}/vids/vid{i}.m4s")
            os.system(f"curl {aud_url} > {location}/auds/aud{i}.m4s")
            sleep(random.randint(1,3))

location = os.getcwd()

os.system(f"curl https://mediacloud.laftel.net/{found}/video/avc1/2/init.mp4 > {location}/vids/vid_init.mp4")
os.system(f"curl https://mediacloud.laftel.net/{found}/audio/mp4a/eng/init.mp4 > {location}/auds/aud_init.mp4")
os.system(f"curl https://mediacloud.laftel.net/{found}/stream.mpd > {location}/stream.mpd")

curl_m4s()

目前vids文件夹包含视频的vid_init.mp4和seg-1.m4s至seg-239.m4s,auds文件夹包含音频的aud_init.mp4和对应分段文件,且已成功将同类型分段文件合并:

location = os.getcwd()
os.system(f"cd {location}/vids && copy /b vid*.m4s vid_full.m4s")
os.system(f"cd {location}/auds && copy /b aud*.m4s aud_full.m4s")

遇到的问题

尝试将init.mp4与合并后的分段文件组合为可播放视频时均失败(文件看似合并成功但无法播放),试过以下几种方法:

# 方法1:直接拼接后转码
os.system("copy /b vid_init.mp4 + vid_full.m4s video_full.m4s")
os.system("ffmpeg -i video_full.m4s -c:a copy video_full.mp4")

# 方法2:尝试用索引文件拼接
os.system("type vid_init.mp4 index.txt > Filename.mp4")

# 方法3:先转分段为mp4再拼接
os.system("ffmpeg -i vid_full.m4s -c:a copy vid_full.mp4")
os.system("copy /b vid_init.mp4 + vid_full.mp4 VIDEO.mp4")

核心问题在于初始化文件是.mp4格式,而非常见的.m4s,且无法通过FFmpeg将init.mp4转为init.m4s格式。

测试资源

  • Laftel播放页:https://laftel.net/player/40269/46123
  • 视频init.mp4:https://mediacloud.laftel.net/2021/04/46773/v15/video/dash/video/avc1/2/init.mp4
  • 音频init.mp4:https://mediacloud.laftel.net/2021/04/46773/v15/video/dash/audio/mp4a/eng/init.mp4
  • 视频seg-1.m4s:https://mediacloud.laftel.net/2021/04/46773/v15/video/dash/video/avc1/2/seg-1.m4s
  • 音频seg-1.m4s:https://mediacloud.laftel.net/2021/04/46773/v15/video/dash/audio/mp4a/eng/seg-1.m4s

需求

寻求基于Python的可行方案,将视频/音频的init.mp4分别与对应seg-*.m4s文件合并,最终生成可正常播放的完整视频文件。


内容的提问来源于stack exchange,提问作者XiBBaL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:52:37