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

yizhihongxing

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

相关文章

  • 如何在Python的NumPy中对数组进行标准化

    标准化是指将数值型数据转换为均值为0,标准差为1的过程,常用于机器学习和数据分析中。在Python的NumPy中,可以通过以下几个步骤对数组进行标准化: 计算数组的均值和标准差 import numpy as np # 创建一个数组 arr = np.array([[1, 2], [3, 4], [5, 6]]) # 计算均值和标准差 mean = np.m…

    python-answer 2023年3月25日
    00
  • python 字符串追加实例

    针对 “Python 字符串追加实例” 这一话题,我将给出以下内容: 1. 什么是字符串追加? 字符串追加指将一个字符串添加至另一个字符串后面,形成一个新的字符串。在 Python 中,我们可以使用 “+” 来实现两个字符串的拼接。例如: string1 = ‘Hello’ string2 = ‘world’ new_string = string1 + s…

    python 2023年6月5日
    00
  • 如何使用Python实现分页查询数据库数据?

    以下是使用Python实现分页查询数据库数据的完整攻略。 分页查询简介 分页查询是指将大量数据分成多个页面进行查询,以便好管理和展示数据。在Python中,可以使用pymysql库实现分查询数据库数据。 步骤1:连接到数据库 在Python,可以使用pymysql库连接到MySQL数据库。以下是连接到MySQL数据库的本语法: import pymysql …

    python 2023年5月12日
    00
  • Python编程实现简单的微博自动点赞

    下面是Python编程实现微博自动点赞的攻略: 1. 准备工作 首先,需要使用Python开发环境,如Anaconda、PyCharm等,并安装必要的Python库,如Selenium、Chrome Driver等。此外,还需要一个微博账号并登录。 2. 获取微博链接 在微博网站上选择要点赞的微博,然后在浏览器地址栏中复制该微博链接。该链接通常以https:…

    python 2023年5月19日
    00
  • python实现b站直播自动发送弹幕功能

    下面是详细的攻略: Python实现B站直播自动发送弹幕功能 1. 前提条件 已经拥有B站账号,并且对应的账号已经开通了直播功能。 在B站账号中申请到了直播的推流地址和推流码。 2. 实现步骤 2.1 安装需要的Python模块 requests模块:用于发送HTTP请求。 websocket模块:实现WebSocket协议。 colorama模块:用于控制…

    python 2023年6月13日
    00
  • python chinesecalendar报错:”no available data for year {}, only year between [{}, {}] supported”

    1.问题描述: 在使用Python的chinesecalendar模块时,有可能会遇到以下报错: “no available data for year {}, only year between [{}, {}] supported”,其中{}部分是指具体的年份,提示我们当前使用的年份不在支持的范围内。 2.问题原因: chinesecalendar模块需…

    python 2023年6月3日
    00
  • 详解Python PIL getpixel()方法

    Python PIL 是常用的图像处理库,getpixel()方法是它提供的获取单个像素值的方法。下面是针对Python PIL getpixel()方法的详细解释: 1. getpixel()方法概述 getpixel()方法是PIL库中的一个方法,用于获取图像中某一像素点的RGB值,其语法如下: pixel_value = Image.getpixel(…

    python-answer 2023年3月25日
    00
  • python3 字符串知识点学习笔记

    Python3字符串知识点学习笔记 在Python3中,字符串是一种非常常见的数据类型。字符串是由一系列字符组成的,可以使用单引号、双引号或三号来表示。本文将为您供一个整攻略,详细讲解Python3字符串的知识点,包括字符串的创建、字符串的操作两个示例说明。 1. 字符的创建 在Python3中,可以使用单引号、双引号或三引号来创建字符串。以下是一些示例: …

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