Python 实现 m3u8 视频下载

这篇具有很好参考价值的文章主要介绍了Python 实现 m3u8 视频下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python 实现 m3u8 视频下载

m3u8 是一种基于文本的媒体播放列表文件格式,通常用于指定流媒体播放器播放在线媒体流。它是一个简单的文本文件,其中包含多个由 URI 引用的媒体资源文件的 URL。m3u8 文件通常包含多个 ts 文件的链接,这些 ts 文件是实际的视频和音频数据文件,通常是通过 HTTP 协议传输。

ts 文件是一种流媒体传输格式,是 MPEG-2 传输流(MPEG-2 Transport Stream)的缩写。ts 文件通常用于存储视频、音频和字幕等媒体数据,是流媒体传输的基本单位。在 m3u8 文件中,ts 文件通常是通过 URI 引用的方式来指定的,播放器会根据 m3u8 文件中的 ts 文件链接,依次请求并下载 ts 文件,然后将其组合成完整的视频流进行播放。

因此,m3u8 文件和 ts 文件在流媒体播放领域密切相关,m3u8 文件是流媒体的播放列表,而 ts 文件是实际的媒体数据文件。m3u8 文件中包含了多个 ts 文件的链接,播放器会根据 m3u8 文件中的 ts 文件链接,依次请求并下载 ts 文件,然后将其组合成完整的视频流进行播放。这种方式可以充分利用网络带宽,提高流媒体的播放效率和质量。同时,m3u8 文件还可以通过定义不同的码率和分辨率等参数,实现适应不同网络环境和设备的自适应流媒体播放。

Python 实现 m3u8 视频下载

基础实现

以下是使用 Python 下载 m3u8 视频并保存为 mp4 的示例代码:

import requests
import os

def download_m3u8_video(url, file_path):
    r = requests.get(url)
    if r.status_code != 200:
        print('m3u8视频下载链接无效')
        return False

    m3u8_list = r.text.split('\n')
    m3u8_list = [i for i in m3u8_list if i and i[0] != '#']

    ts_list = []
    for ts_url in m3u8_list:
        ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
        ts_list.append(ts_url)

    with open(file_path, 'wb') as f:
        for ts_url in ts_list:
            r = requests.get(ts_url)
            if r.status_code == 200:
                f.write(r.content)
    print('m3u8视频下载完成')
    return True

def convert_ts_to_mp4(ts_file_path, mp4_file_path):
    os.system(f'ffmpeg -i {ts_file_path} -c copy {mp4_file_path}')

if __name__ == '__main__':
    url = '输入m3u8流媒体播放列表文件下载链接'
    ts_file_path = '输入ts文件保存路径'
    mp4_file_path = '输入mp4文件保存路径'

    download_m3u8_video(url, ts_file_path)
    convert_ts_to_mp4(ts_file_path, mp4_file_path)

在这个示例中,download_m3u8_video 函数用于下载 m3u8 视频,convert_ts_to_mp4 函数用于将下载的 ts 文件转换为 mp4 文件。首先,使用 requests 库下载 m3u8 文件,并解析出其中的 ts 文件链接。然后,遍历 ts 文件链接列表,使用 requests 库下载每个 ts 文件,并将其写入到一个文件中。最后,使用 ffmpeg 工具将下载的 ts 文件转换为 mp4 文件。需要注意的是,为了使用 ffmpeg 工具,需要在系统中安装 ffmpeg,并将其添加到环境变量中。

实际应用中,可以根据具体情况对代码进行调整和优化,例如增加异常处理、优化下载速度等。同时,由于 m3u8 视频格式的特殊性,下载过程可能会较为耗时,需要耐心等待一段时间。

使用多线程来优化下载速度

为了优化下载速度,可以使用多线程或异步 IO 的方式来下载 m3u8 视频。以下是使用多线程下载 m3u8 视频的示例代码:

import requests
import os
import threading

class Downloader(threading.Thread):
    def __init__(self, url, ts_url, file_path):
        threading.Thread.__init__(self)
        self.url = url
        self.ts_url = ts_url
        self.file_path = file_path

    def run(self):
        r = requests.get(self.ts_url, stream=True)
        if r.status_code == 200:
            with open(self.file_path, 'wb') as f:
                for chunk in r.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(chunk)

def download_m3u8_video(url, file_path):
    r = requests.get(url)
    if r.status_code != 200:
        print('m3u8视频下载链接无效')
        return False

    m3u8_list = r.text.split('\n')
    m3u8_list = [i for i in m3u8_list if i and i[0] != '#']

    ts_list = []
    for ts_url in m3u8_list:
        ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
        ts_list.append(ts_url)

    threads = []
    for i, ts_url in enumerate(ts_list):
        ts_file_path = file_path.rsplit('.', 1)[0] + f'_{i}.ts'
        thread = Downloader(url, ts_url, ts_file_path)
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()

    print('m3u8视频下载完成')
    return True

def convert_ts_to_mp4(ts_file_path, mp4_file_path):
    os.system(f'ffmpeg -i {ts_file_path} -c copy {mp4_file_path}')

if __name__ == '__main__':
    url = '输入m3u8流媒体播放列表文件下载链接'
    ts_file_path = '输入ts文件保存路径'
    mp4_file_path = '输入mp4文件保存路径'

    download_m3u8_video(url, ts_file_path)
    convert_ts_to_mp4(ts_file_path, mp4_file_path)

在这个示例中,定义了一个 Downloader 类,用于下载每个 ts 文件。在 Downloader 类中,使用 requests 库的 stream 参数将下载进度分块,每次下载 1024 个字节,然后写入到文件中。在 download_m3u8_video 函数中,使用多线程的方式同时下载多个 ts 文件,并等待所有线程下载完成后再将其合并成一个 mp4 文件。这样可以大大缩短下载时间。

需要注意的是,多线程下载可能会导致网络瓶颈,从而降低下载速度。因此,在实际应用中,需要根据具体情况选择合适的下载方式,并进行调整和优化。例如,可以使用异步 IO、协程等技术来优化下载速度。另外,为了提高下载速度,还可以使用 CDN、负载均衡、网络加速等技术来优化下载环节。

使用异步 IO 和协程来优化下载速度

协程(Coroutine)是一种轻量级的线程,可以在单线程中实现多个任务的并发执行,从而提高程序的效率和性能。Python 中的协程是通过 async/await 关键字来实现的,可以使用 asyncio 库来进行协程编程。

异步 IO(Asynchronous IO)是一种非阻塞式 IO 模型,可以在进行 IO 操作时不会阻塞程序的执行,从而提高程序的效率和响应速度。Python 中的异步 IO 是通过 asyncio 库来实现的,可以使用 async/await 关键字和协程来实现异步 IO 操作。

异步 IO 和协程的结合可以实现高效的并发编程,通过异步 IO 可以充分利用 CPU 和网络带宽等资源,提高程序的效率和性能;而通过协程可以在单线程中实现多个任务的并发执行,避免了线程切换的开销,从而提高程序的响应速度和并发性能。在实际应用中,我们可以根据具体情况选择和优化异步 IO 和协程的使用方式,以达到最佳的效果和性能。

为了使用异步 IO 和协程来优化下载速度,可以使用 aiohttp 和 asyncio 库来实现。以下是使用异步 IO 和协程下载 m3u8 视频的示例代码:

import aiohttp
import asyncio
import os

async def download_ts_file(ts_url, ts_file_path):
    # 防止ssl报错:
    # aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host ***.****.com:443 ssl:True
    # [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local
    # issuer certificate (_ssl.c:1123)')]
    conn = aiohttp.TCPConnector(ssl=False)
    async with aiohttp.ClientSession(connector=conn) as session:
        async with session.get(ts_url) as response:
            if response.status != 200:
                print(f'{ts_url} 下载失败')
                return False
            with open(ts_file_path, 'wb') as f:
                while True:
                    chunk = await response.content.read(1024)
                    if not chunk:
                        break
                    f.write(chunk)
    print(f'{ts_url} 下载完成')
    return True

async def download_m3u8_video(url, file_path):
    # 防止ssl报错
    conn = aiohttp.TCPConnector(ssl=False)
    async with aiohttp.ClientSession(connector=conn) as session:
        async with session.get(url) as response:
            if response.status != 200:
                print('m3u8视频下载链接无效')
                return False

            m3u8_text = await response.text()
            m3u8_list = m3u8_text.split('\n')
            m3u8_list = [i for i in m3u8_list if i and i[0] != '#']

            tasks = []
            for i, ts_url in enumerate(m3u8_list):
                ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
                ts_file_path = file_path.rsplit('.', 1)[0] + f'_{i}.ts'
                task = asyncio.ensure_future(
                    download_ts_file(ts_url, ts_file_path))
                tasks.append(task)

            await asyncio.gather(*tasks)

    print('m3u8视频下载完成')
    return True

def convert_ts_to_mp4(ts_file_path, mp4_file_path):
    os.system(f'ffmpeg -i {ts_file_path} -c copy {mp4_file_path}')

if __name__ == '__main__':
    url = '输入m3u8流媒体播放列表文件下载链接'
    ts_file_path = '输入ts文件保存路径'
    mp4_file_path = '输入mp4文件保存路径'

    loop = asyncio.get_event_loop()
    loop.run_until_complete(download_m3u8_video(url, ts_file_path))
    convert_ts_to_mp4(ts_file_path, mp4_file_path)

在这个示例中,使用了 aiohttp 和 asyncio 库来实现异步 IO 和协程。定义了两个协程函数:download_m3u8_videodownload_ts_file。在 download_m3u8_video 函数中,使用 aiohttp 库的 ClientSession 类异步获取 m3u8 文件,并解析出其中的 ts 文件链接。然后,使用协程和异步 IO 的方式异步下载每个 ts 文件,并将其写入到本地文件中。在下载过程中,使用了异步 IO 和协程的方式,可以充分利用网络带宽,提高下载速度。

download_m3u8_video 函数中,使用了 async for 循环来遍历 m3u8 文件中的 ts 文件链接,并创建了一个任务列表 tasks,用于存储异步下载的任务。然后,使用 asyncio.ensure_future 方法将每个任务添加到任务列表中。最后,使用 asyncio.gather 方法同时运行所有异步任务,等待所有任务完成后,即可完成整个 m3u8 视频的下载。

最后,使用 ffmpeg 工具将下载的 ts 文件转换为 mp4 格式的视频文件。这个步骤并不涉及异步 IO 和协程,只是为了将下载的 ts 文件转换为可用的视频文件格式。

使用协程可以充分利用网络带宽,提高下载速度。需要注意的是,在使用协程时,需要考虑到 CPU 和内存等资源的占用,避免出现资源耗尽或者死锁等问题。同时,协程的使用需要掌握一定的异步编程技巧,例如使用 async/await 关键字、协程调度等。因此,在实际应用中,需要根据具体情况进行调整和优化,以获取最佳的性能和效果。文章来源地址https://www.toymoban.com/news/detail-464657.html

到了这里,关于Python 实现 m3u8 视频下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DPlayer m3u8 视频禁止下载

    正常的 m3u8 格式视频通过控制台是无法下载的,但是可以通过插件下载,下面介绍如何规避这个问题。 思路: 后端生成一个一次性的密钥,前端放在请求头中 ,可以防止大部分插件下载。这里只说前端。 集成 DPlayer 播放器这里就不说了,网上一大推。

    2024年01月24日
    浏览(39)
  • ffmpeg 下载网上m3u8的视频文件

    FFmpeg 是一个音视频领域使用最广泛的跨平台开源库。由C语言编写,但广泛的为 C/C++、C#、Java、Python 等主流编程语言所调用。它集合了几乎所有的编码解码库与流协议,几乎能完美处理音视频开发领域的所有需求。 方式一:源码安装 FFmpeg 通过编译源码安装 FFmpeg 的优点是可

    2023年04月09日
    浏览(40)
  • 如何使用JAVA实现多线程下载m3u8视频并且合并代码亲测有效

    我们常常在网页上遇到好看的视频就想保存起来,可是有的视频文件是m3u8格式的,有的小伙伴可能就难住了,那么这种视频文件应该下载呢,可能有人会用插件或者其他工具下载,方法也是多种多样的,其实这种文件就是很多视频切片成的文件路径,不能够直接获取到视频流

    2024年02月05日
    浏览(44)
  • 「Python|音视频处理|场景案例」如何使用ffmpeg下载m3u8视频到本地并保存成mp4

    本文主要介绍如何使用ffmpeg批量下载视频到本地并保存成指定格式。 当我们希望将网页上的视频下载到本地的时候,我们可能获取到的视频地址是指向 .m3u8 格式的,当视频多的时候,手动下载并使用工具转换格式就显得工作量过大。 ffmpeg 是一个强大的音视频处理工具,具体

    2024年02月16日
    浏览(72)
  • M3U8在线视频下载(解决DMM等网站下载的视频是dcv格式)

    1.Edge(或chrome浏览器) 2.N_m3u8DL-CLI 1.首先需要你购买的正版视频文件支持视频播放,然后在准备播放界面按F12调出控制台选择网络,之后再点击播放,这时候会弹出新的窗口用于播放,在新的窗口再次按F12调出控制台,这时候会单独打开一个控制台窗口。 2.搜索m3u8找到一个chu

    2024年02月03日
    浏览(118)
  • 安卓 Windows 通过ts链接获取m3u8视频地址进行视频下载

    目录 环境: 解决思路及过程: .TS—— .m3u8 1.利用安卓视频缓存机制合成视频 1.1 找到鲨鱼浏览器目录 1.2 进入Android/data/com.zhijianzhuoyue.sharkbrowser/cashe 缓存目录  1.3 显示隐藏文件 1.4 进入可以看到两个随机生成的视频文件夹,进入一个即是对应视频播放缓存目录 1.4 再次进入得

    2024年02月11日
    浏览(55)
  • 如何将页面m3u8、blob类型的视频链接下载下来?

    有时候访问页面遇到喜欢的视频,会直接使用代码检查,找到视频链接直接拷贝下载,但是遇到video标签中的链接带有blob(如图),直接拷贝访问是无法下载的。我们需要按以下步骤来实现目的: 1.F12开启代码检查,点击代码区,CTR+F调出搜索框,输入video,找到video标

    2024年02月11日
    浏览(44)
  • 【Win】怎么下载m3u8视频\怎么通过F12开发人员工具获取视频地址\怎么下载完整的.ts格式视频

    怎么下载m3u8视频?首先通过浏览器本地的开发人员工具,获取m3u8的地址,然后再通过第三方下载工具下载,此处以 N_m3u8DL-CLI_v3.0.2 为例 如下图的步骤,即可获取到视频的m3u8地址 打开 N_m3u8DL-CLI_v3.0.2 ,粘贴地址 最后,在软件文件夹对应的 Downloads 目录下就能找到下载的视频

    2024年04月26日
    浏览(53)
  • 【M3U8】python(流视频数据)

    现在大部分视频客户端都采用HTTP Live Streaming,而不是直接播放MP4等视频文件(HLS,Apple为了提高流播效率开发的技术)。HLS技术的特点是将流媒体切分为若干【TS片段】(比如几秒一段),然后通过一个【M3U8列表文件】将这些TS片段批量下载供客户端播放器实现实时流式播放

    2023年04月09日
    浏览(29)
  • Python爬取m3u8格式的视频

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 在某一天,群友分享了一些小视频,手机端可以正常观看,但是到了电脑上,输入网址之后会下载下来一个m3u8格式的文件,这就让我犯了难。所以我就研究了一下,并使用Python来

    2023年04月13日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包