这里提供一份详细的python合成m3u8视频为MP4的攻略,包含以下步骤:
步骤一:下载m3u8文件及其对应的视频流
首先,需要使用requests库下载m3u8文件及其对应的多个TS文件。这里可以使用以下代码:
import requests
m3u8_url = "http://example.com/example.m3u8" # 输入m3u8的URL
res = requests.get(m3u8_url) # 获取m3u8文件内容
m3u8_text = res.text # 将m3u8文件内容转成字符串格式
# 解析m3u8文件内容,获取每个TS文件的URL
ts_urls = []
for line in m3u8_text.split('\n'):
if line and not line.startswith("#"):
ts_url = line.strip()
if not ts_url.startswith("http"):
ts_url = m3u8_url.rsplit('/', 1)[0] + '/' + ts_url
ts_urls.append(ts_url)
# 下载每个TS文件
for i, ts_url in enumerate(ts_urls):
res = requests.get(ts_url)
with open(f"{i+1}.ts", "wb") as f:
f.write(res.content)
这段代码首先使用requests库获取m3u8文件的文本内容,然后进行解析,获取每个TS文件的URL。最后,通过循环遍历每个TS文件的URL,使用requests库下载TS文件。
步骤二:将多个TS文件合成一个文件
下载完所有的TS文件后,需要将这些小文件合并成一个大文件。这里可以使用ffmpeg库实现。
import os
import subprocess
# 拼接所有TS文件
cmd = ' '.join(f"file '{i}.ts'" for i in range(1, len(ts_urls) + 1))
with open("input.txt", "w") as f:
f.write(cmd)
output_filename = "output.mp4"
# 使用ffmpeg命令将所有TS文件合并
subprocess.call(f"ffmpeg -f concat -safe 0 -i input.txt -c copy {output_filename}.mp4", shell=True)
# 删除临时文件
for i in range(1, len(ts_urls) + 1):
os.remove(f"{i}.ts")
os.remove("input.txt")
这段代码通过将多个TS文件的路径写入一个文本文件(input.txt),再使用ffmpeg的concat命令将这些TS文件拼接成一个大文件。拼接完成后,删除临时生成的TS文件和文本文件input.txt。
示例一:下载优酷视频
以优酷为例,假设现在需要下载链接为https://v.youku.com/v_show/id_XMzI3MTgxMDY2NA==.html 的视频。
在该视频页面中,可以找到其对应的m3u8文件链接,为https://c-h5.ykimg.com/201206/0ee28b048e866cb2e035afcd9167de07/playlist.m3u8。因此,只需要将此链接传入步骤一的代码中即可开始下载。
示例二:下载TS文件加密视频
一些视频网站为了保护版权,会对m3u8文件中的TS文件进行加密。这时候需要在requests.get()时添加其余的headers,来正确获取m3u8文件及其对应的TS文件。
以爱奇艺为例,假设现在需要下载链接为https://www.iqiyi.com/v_19rwlevw98.html 的视频。
在该视频页面中,可以找到其对应的m3u8文件链接,为https://pcvideoyd.iqiyi.com/dash?pr=242000&xt=urn%3Aci%3Ax-2fa57b95f7874a1392dfec85d4cd10aa&ot=0&vid=5dd7e409f052b78a5cf11e9002e26f7b&dtype=85&rate=0&drv=Mp4_1080p&tag=pcweb&ff=2002&src=01010031010000000000&sb=0_c8c1f003-e5cf-49cb-9211-61fa17c1414c&uid=3e8f1614-b0b1-4237-b691-bc12e64af3b1_t_1633594276450&ver=1&tvid=14185241900&ps=0&k_uid=3e8f1614-b0b1-4237-b691-bc12e64af3b1_t_1633594276450&k_tag=1&k_ver=1&header=1&ost=0&ppt=default&t={timestamp}。
由于该m3u8文件被加密了,因此需要在requests.get()时添加headers信息,以正确访问。
import requests
url = "https://pcvideoyd.iqiyi.com/dash?pr=242000&xt=urn%3Aci%3Ax-2fa57b95f7874a1392dfec85d4cd10aa&ot=0&vid=5dd7e409f052b78a5cf11e9002e26f7b&dtype=85&rate=0&drv=Mp4_1080p&tag=pcweb&ff=2002&src=01010031010000000000&sb=0_c8c1f003-e5cf-49cb-9211-61fa17c1414c&uid=3e8f1614-b0b1-4237-b691-bc12e64af3b1_t_1633594276450&ver=1&tvid=14185241900&ps=0&k_uid=3e8f1614-b0b1-4237-b691-bc12e64af3b1_t_1633594276450&k_tag=1&k_ver=1&header=1&ost=0&ppt=default&t={timestamp}"
headers = {'Referer': 'https://www.iqiyi.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'}
res = requests.get(url, headers=headers)
m3u8_text = res.text # 将m3u8文件内容转成字符串格式
# 解析m3u8文件内容,获取每个TS文件的URL
ts_urls = []
for line in m3u8_text.split('\n'):
if line and not line.startswith("#"):
ts_url = line.strip()
if not ts_url.startswith("http"):
ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
ts_urls.append(ts_url)
# 下载每个TS文件
for i, ts_url in enumerate(ts_urls):
res = requests.get(ts_url, headers=headers)
with open(f"{i+1}.ts", "wb") as f:
f.write(res.content)
接下来,直接将上述代码放入步骤一的代码中完成下载,再按照步骤二将下载好的TS文件合并为MP4即可。
以上是将下载到本地m3u8视频合成MP4的完整攻略,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python将下载到本地m3u8视频合成MP4的代码详解 - Python技术站