如何用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
相关产品推荐
相关产品推荐

