python下载视频

 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转

目录

一,猫抓获取视频地址

二,安装配置ffmpeg

1,windows使用

2,python使用

三,碧站视频

四,合并ts文件

1,背景

2,实现

4,缺点

五,下载m3u8视频

1,背景

2,实现V1

3,实现V2

六,分析m3u8链接


一,猫抓获取视频地址

资源分享

这里可以下载maozhua.rar,解压之后添加到google或者edge浏览器,就能看到浏览器有一个猫猫:

对于m3u8的视频、m4s的视频,猫抓可以获取视频地址。

二,安装配置ffmpeg

1,windows使用

官网下载ffmpeg-2023-08-07-git-d295b6b693-full_build

放到一个没有空格的路径中:

 再把bin目录配置到环境变量。

2,python使用

官网下载ffmpeg

下载之后复制到site-packages中:

三,碧站视频

碧站都是m4s的视频,但是画面和音频是分开成2个m4s的。

用猫抓获取资源链接:

视频比较大,音频比较小,还有个中间大小的不用管。

把视频下下来,重命名为1.m4s,音频下下来,重命名为2.m4s,然后用dos访问文件所在目录:

cd Downloads

再执行一行命令:

ffmpeg -loglevel quiet -i 1.m4s -i 2.m4s -c copy -y out.mp4 & del 1.m4s 2.m4s

四,合并ts文件

1,背景

当你从网站下载了一集动漫,然后发现是一堆ts文件,虽然可以打开,但是每个都是10秒左右,很不方便。

这时,可以用python合并ts文件。

2,实现

代码:

def merge_file(path, save_path):
    file_names = os.listdir(path)
    if 'file_list.txt' in file_names:
        os.remove(path+'file_list.txt')
    f = open(path+'file_list.txt', 'w+')
    for one in file_names:
        f.write("file '" + one + "'\n")
    f.close()
    ffmpeg_bin_dic = 'C:/ffmpeg-2023-08-07-git-d295b6b693-full_build/bin/'
    os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path)

注意,需要看一下file_list.txt中的各个ts顺序,和预期是否一致。

如果不一致,调整原有ts的命名,或者调整代码,直到file_list.txt中的各个ts顺序,和预期一致,才能得到正确的mp4文件。

4,缺点

貌似合并出来的视频经常有问题。。。

五,下载m3u8视频

1,背景

当你用猫抓一个m3u8视频的地址,那就可以解析m3u8,获取其中的ts列表,多线程下载所有ts文件。

全部下完之后,用ffmpeg合并成mp4

2,实现V1

Downloader把ts列表做循环拆分,近似均分给每个线程,同时下载1个m3u8视频。

download_m3u8_video输入m3u8视频的地址,解析ts列表,调用Downloader并控制多线程。

import requests
import os
import threading

tnum = 64

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

    def run(self):
        for i in range(self.id, len(self.ts_list), tnum):
            ts_url = self.ts_list[i]
            r = requests.get(ts_url, stream=True)
            if r.status_code == 200:
                with open(self.file_path + f'_{i}.ts', '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)

    f = open(file_path+'file_list.txt', 'w+')
    for i in range(len(ts_list)):
        f.write('file \'' + f'_{i}.ts' + "'\n")
    f.close()

    threads = []
    for i in range(0, tnum):
        thread = Downloader(i, url, ts_list, file_path.rsplit('.', 1)[0])
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()

    return not endflag

def merge_file(path, save_path):
    ffmpeg_bin_dic = 'C:/ffmpeg-2023-08-07-git-d295b6b693-full_build/bin/'
    os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path)


def down(url):
    name = url[-41:-5]
    print(name)
    ts_file_path = 'D:/v/' + name+'/'
    os.makedirs(ts_file_path)
    mp4_file_path = 'D:/v2/'+name+'.mp4'
    global endflag
    endflag = False
    if download_m3u8_video(url, ts_file_path):
        print('m3u8视频下载完成')
        merge_file(ts_file_path, mp4_file_path)
    else :
        print('error!!!!')
        print(url)

url_list = [
    'https://sth.com/videos/202305091/d63b006e-c6fb-4997-8d43-7ebd086e9c75.m3u8',
    'https://sth.com/videos/202305081/2c9fa41b-e25b-4371-908f-d246628d7bed.m3u8',
]

for url in url_list:
    down(url)

3,实现V2

import requests
import os
import threading

tnum = 64

def download_m3u8_video(url, file_path):
    r = requests.get(url)
    if r.status_code != 200:
        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)

    f = open(file_path + 'file_list.txt', 'w+')
    for i in range(len(ts_list)):
        f.write('file \'' + f'_{i}.ts' + "'\n")
    f.close()

    for i in range(0, len(ts_list)):
        ts_url = ts_list[i]
        r = requests.get(ts_url, stream=True)
        if r.status_code == 200:
            with open(file_path + f'_{i}.ts', 'wb') as f:
                for chunk in r.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(chunk)
    return True


def merge_file(path, save_path):
    ffmpeg_bin_dic = 'C:/ffmpeg-2023-08-07-git-d295b6b693-full_build/bin/'
    os.system(ffmpeg_bin_dic+'ffmpeg -f concat -safe 0 -i '+path+'file_list.txt'+' -c '+ ' copy ' +save_path)


def down(url):
    name = url[-41:-5]
    print(name)
    ts_file_path = 'D:/v/' + name+'/'
    os.makedirs(ts_file_path)
    mp4_file_path = 'D:/v2/'+name+'.mp4'
    ret = download_m3u8_video(url, ts_file_path)
    print(name, end=' ')
    if ret:
        print('m3u8视频下载完成')
        merge_file(ts_file_path, mp4_file_path)
    else :
        print('error!!!!')


class down_list(threading.Thread):
    def __init__(self, url_list, id):
        threading.Thread.__init__(self)
        self.id = id
        self.url_list = url_list
    def run(self):
        for i in range(self.id, len(self.url_list), tnum):
            url = self.url_list[i]
            down(url)

def down_all(url_list):
    threads=[]
    for i in range(0, tnum):
        thread = down_list(url_list,i)
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()


url_list = [

]


down_all(url_list)

六,分析m3u8链接

有些网站的会员和非会员在同一个网址播放的视频是不一样的,比如非会员只有2分钟可以看。

可以用个简单的代码分析m3u8链接里面的视频是长视频还是短视频。

def testUrl(url):
    print(url)
    print('ans:')
    r = requests.get(url)
    m3u8_list = r.text.split('\n')
    m3u8_list = [i for i in m3u8_list if i and i[0] != '#']
    if len(m3u8_list) < 50:
        file = open('D:\\out.txt', 'a')
        file.write(url+"\n")
        file.close()
    else:
        print(url+" ok")

### 回答1: 下载视频Python 中可以使用第三方库来实现。其中,一个比较流行的库是 `youtube-dl`。它提供了命令行界面和 Python API,能够从 YouTube 和许多其他视频网站下载视频。 要使用 `youtube-dl`,你需要先使用 `pip` 安装它: ``` pip install youtube-dl ``` 然后,你就可以使用 `youtube-dl` 模块中的 `download()` 函数来下载视频了。例如: ```python import youtube_dl ydl_opts = { 'format': 'bestvideo+bestaudio/best', 'outtmpl': '%(title)s.%(ext)s', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', }] } with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc']) ``` 这会下载 YouTube 上的视频,并将其保存到当前目录中。 注意:根据不同的视频网站的使用条款和视频版权情况,下载视频可能是不合法的。请确保你有足够的权利来下载视频,或者仅在允许下载的情况下使用这些工具。 ### 回答2: 在Python中实现下载视频的方法有多种。一种常用的方法是使用第三方库requests和ffmpeg库。 首先,需要使用requests库发送一个HTTP请求来获取视频的二进制数据。可以使用requests.get()方法指定视频的URL,然后将响应的二进制数据保存到一个文件中。 接下来,需要使用ffmpeg库来将视频的二进制数据转换为真正的视频文件。可以使用subprocess库来执行命令行中的ffmpeg命令。 具体步骤如下: 1. 首先,需要安装requests和ffmpeg库。可以在终端中运行以下命令来安装这两个库: ``` pip install requests ffmpeg-python ``` 2. 在Python代码中,导入所需的库: ```python import requests import subprocess ``` 3. 发送HTTP请求获取视频的二进制数据,并保存到文件中: ```python url = '视频的URL' response = requests.get(url) with open('video.mp4', 'wb') as f: f.write(response.content) ``` 4. 使用ffmpeg库将二进制数据转换为视频文件: ```python subprocess.run(['ffmpeg', '-i', 'video.mp4', 'output.mp4']) ``` 这会将`video.mp4`文件转换为`output.mp4`文件。 请注意,这里假设了视频的URL是有效的,并且视频的格式为MP4。如果视频的格式为其他格式,可能需要调整ffmpeg命令的参数。 以上是使用Python下载视频的一种常用方法。根据具体情况,可能还需要处理一些其他的细节,如视频的格式转换、断点续传等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值