python将下载到本地m3u8视频合成MP4的代码详解

这里提供一份详细的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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Django 再谈一谈json序列化

    Django 再谈一谈 json 序列化 在 Django 中,json 序列化是常用的一种数据格式转换方式。通过将对象转化为 json 字符串,我们可以在前端以及其他语言的服务(如 Node.js)中使用这些数据。Django 的 json 序列化涉及到一些细节和注意事项,在本文中,我们会进行深入的说明,并提供两个常见的示例说明。 为什么需要 json 序…

    python 2023年6月2日
    00
  • python中列表添加元素的几种方式(+、append()、extend())

    以下是“Python中列表添加元素的几种方式(+、append()、extend())”的完整攻略。 1. 列表添加元素的几种方式 在Python中,可以使用多种方式向列表添加元素。下面介绍三种常用的方式:使用+运符、使用append()方法和使用extend()方法。 1.1 使用运算符 使用运算符可以将两个列表合并成一个新的列表。示例如下: list1 …

    python 2023年5月13日
    00
  • 使用BeautifulSoup4解析XML的方法小结

    使用BeautifulSoup4解析XML是Web数据挖掘中的一个重要步骤。在本文中,我们将介绍如何使用BeautifulSoup4解析XML,并提供两个示例,以便更好地理解这个过程。 使用BeautifulSoup4解析XML的方法小结 使用BeautifulSoup4解析XML的方法如下: 使用Python的requests库获取XML文件。 使用Bea…

    python 2023年5月15日
    00
  • Python结合Selenium简单实现Web自动化测试

    下面我将为您详细讲解“Python结合Selenium简单实现Web自动化测试”的完整攻略。 一、什么是Selenium Selenium是广泛使用的Web应用程序自动化测试工具,支持多种浏览器和多种语言编写自动化测试脚本。它提供了一种便捷的方式来在Web应用程序上执行测试操作。 二、Selenium Web自动化测试的应用场景 Web自动化测试是在Web应…

    python 2023年5月19日
    00
  • python时间整形转标准格式的示例分享

    标题:Python时间整形转标准格式的示例分享 首先需要导入Python的时间模块time: import time 示例一:将时间戳转换为标准格式的时间字符串 假设有一个时间戳timestamp,我们想将其转换成标准格式的时间字符串。 timestamp = 1633716029 timeStr = time.strftime("%Y-%m-%d…

    python 2023年6月2日
    00
  • Python实现从文件中加载数据的方法详解

    在Python中,我们可以使用多种方法从文件中加载数据。本文将详细讲解Python实现从文件中加载数据的方法,包括使用内置函数、使用第三方库和自定义方法。同时,我们将提供两个示例,以便更好地理解这些方法的使用。 使用内置函数 Python中的内置函数open()可以用于打开文件,并返回一个文件对象。我们可以使用文件对象的read()方法来读取文件中的数据。以…

    python 2023年5月15日
    00
  • python实现人人自动回复、抢沙发功能

    Python实现人人自动回复、抢沙发功能 概述 人人网是国内知名的社交网络,由于其用户多样化和活跃度高等特点,很多人喜欢在其上发布内容和交友互动。本文将介绍如何使用Python实现人人网自动回复和抢沙发功能。 前置需求 在进行本文介绍的功能实现前,你需要掌握以下技能: Python编程语言的基础知识 使用requests库进行Web请求 使用Beautifu…

    python 2023年5月19日
    00
  • python3 生成器表达式

    在 Python3 中,生成器表达式是一种语言结构,它可以快速地创建一个可迭代对象。生成器表达式类似于列表推导式,但使用圆括号而不是方括号,并且返回的是一个生成器对象而不是一个列表。 在 Python3 中,生成器表达式有两种类型:生成器函数和生成器表达式。 生成器函数: 生成器函数是一种特殊的函数,在函数中使用 yield 语句来生成一个值,然后暂停函数执…

    python 2023年5月1日
    00
合作推广
合作推广
分享本页
返回顶部