Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以下载文件的特定部分?_Python_Audio_Video_Download - Fatal编程技术网

Python 是否可以下载文件的特定部分?

Python 是否可以下载文件的特定部分?,python,audio,video,download,Python,Audio,Video,Download,所以我想下载一个文件,但我不需要全部。我是否可以跳过文件的前1/4部分,然后下载其余部分 我已经尝试过python youtube dl包,我认为有一些相关的标志可能会起作用。但是我不知道如何使用它们 所以不管怎样,如果有人曾经尝试过这个,你介意分享一下你是怎么做的吗。或者这可能吗?编辑:我有点错过了一件事,很抱歉,你不只是想下载一段二进制文件,而是想获得一段youtube视频。我下面的答案并不适用,你不能仅仅从视频中挑选一个二进制片段,然后期望它能工作,至少对于大多数开箱即用的容器类型来说是不

所以我想下载一个文件,但我不需要全部。我是否可以跳过文件的前1/4部分,然后下载其余部分

我已经尝试过python youtube dl包,我认为有一些相关的标志可能会起作用。但是我不知道如何使用它们


所以不管怎样,如果有人曾经尝试过这个,你介意分享一下你是怎么做的吗。或者这可能吗?

编辑:我有点错过了一件事,很抱歉,你不只是想下载一段二进制文件,而是想获得一段youtube视频。我下面的答案并不适用,你不能仅仅从视频中挑选一个二进制片段,然后期望它能工作,至少对于大多数开箱即用的容器类型来说是不行的

原始答复: 答案是也许你可以。它取决于服务器,服务器可能支持也可能不支持部分下载。 请在此处阅读更多信息:

如果确实支持,您唯一要做的就是添加一个范围标头。Python示例,从下面的文件中提取第二个1kb块

import urllib.request

url = 'http://ipv4.download.thinkbroadband.com/100MB.zip'
req = urllib.request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0')
req.add_header('Range', 'bytes=1024-2047') # <=== range header
res = urllib.request.urlopen(req)
with open('test.bin', 'wb') as f:
    f.write(res.read())

编辑:我有点错过了一件事,很抱歉,你不只是想下载一段二进制文件,而是想获得一段youtube视频。我下面的答案并不适用,你不能仅仅从视频中挑选一个二进制片段,然后期望它能工作,至少对于大多数开箱即用的容器类型来说是不行的

原始答复: 答案是也许你可以。它取决于服务器,服务器可能支持也可能不支持部分下载。 请在此处阅读更多信息:

如果确实支持,您唯一要做的就是添加一个范围标头。Python示例,从下面的文件中提取第二个1kb块

import urllib.request

url = 'http://ipv4.download.thinkbroadband.com/100MB.zip'
req = urllib.request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0')
req.add_header('Range', 'bytes=1024-2047') # <=== range header
res = urllib.request.urlopen(req)
with open('test.bin', 'wb') as f:
    f.write(res.read())

鲍里斯的观点很好。视频文件通常有一个标题,其中包括视频大小、帧速率和其他信息

此外,框架通常不会完全存储,而是只存储框架中的更改,以确保大量空间的安全。如果从字节x下载到字节y,则会丢失标题,并且无法确保获得帧的边界

但是,如果你只想下载Youtube视频的某一部分,直到视频结束,你只需要知道该部分的第二个开始,你感兴趣的地方。然后您只需要稍微更改URL并将&t=x添加到其中,x是起始的第二个整数

所以如果你想从02:25开始看这段视频的其余部分

它变成:

https://youtu.be/LUk73pUe9i4?t=125
或者,这似乎给出了相同的结果:

https://www.youtube.com/watch?v=LUk73pUe9i4&feature=youtu.be&t=125
应该可以在您使用的库中将其用作url

但我不知道是否也有一个变量的持续时间,如果这是有关你。但我想,你只是想要剩下的视频,对吗


但是如果它是相关的,你仍然可以计算结束,这可能是困难的,因为在以秒为单位的长度和以字节为单位的大小之间实际上没有直线的线性依赖关系,或者说如果你想在第100秒到第500秒之间下载视频部分,这会有点混乱。开始下载第一个,比如说5MB,从第二个500开始。扔掉足够多的字节以丢弃标头和初始帧,并将剩余的字节用作停止模式。所以你会从100开始下载,一旦你找到你的模式,你知道,你已经超过了第二个500。是的,我说过会弄得一团糟:-

鲍里斯的观点很好。视频文件通常有一个标题,其中包括视频大小、帧速率和其他信息

此外,框架通常不会完全存储,而是只存储框架中的更改,以确保大量空间的安全。如果从字节x下载到字节y,则会丢失标题,并且无法确保获得帧的边界

但是,如果你只想下载Youtube视频的某一部分,直到视频结束,你只需要知道该部分的第二个开始,你感兴趣的地方。然后您只需要稍微更改URL并将&t=x添加到其中,x是起始的第二个整数

所以如果你想从02:25开始看这段视频的其余部分

它变成:

https://youtu.be/LUk73pUe9i4?t=125
或者,这似乎给出了相同的结果:

https://www.youtube.com/watch?v=LUk73pUe9i4&feature=youtu.be&t=125
应该可以在您使用的库中将其用作url

但我不知道是否也有一个变量的持续时间,如果这是有关你。但我想,你只是想要剩下的视频,对吗

但是如果它是相关的,你仍然可以计算结束,这可能是困难的,因为在以秒为单位的长度和以字节为单位的大小之间实际上没有直线的线性依赖关系,或者说如果你想在第100秒到第500秒之间下载视频部分,这会有点混乱。开始下载第一个,比如说5MB,从第二个500开始。扔掉足够多的字节以丢弃标头和初始帧,并将剩余的字节用作停止模式。所以你会从100开始下载,一旦你找到你的模式,你知道,你已经超过了第二个500。耶
啊,我说它会变得一团糟:-

有人建议使用ffmpeg和youtube dl的组合来做你想做的事情:

下面是一个建议的例子,正如上面的链接所示。如您所见,youtube dl仅用于获取视频URL,ffmpeg执行以下任务:

ffmpeg -i $(youtube-dl -f 22 --get-url https://www.youtube.com/watch?v=ZbZSe6N_BXs) -ss 00:00:10 -t 00:00:30 -c:v copy -c:a copy happy.mp4
以类似方式启动ffmpeg并下载一段3h视频的示例:

import youtube_dl, subprocess

URL = "https://www.youtube.com/watch?v=eyU3bRy2x44"
FROM = "00:00:15"
TO = "00:00:25"
TARGET = "demo.mp4"

with youtube_dl.YoutubeDL({'format': 'best'}) as ydl:
    result = ydl.extract_info(URL, download=False)
    video = result['entries'][0] if 'entries' in result else result

url = video['url']
subprocess.call('ffmpeg -i "%s" -ss %s -t %s -c:v copy -c:a copy "%s"' % (url, FROM, TO, TARGET))

有人建议结合使用ffmpeg和youtube dl来实现您在这里想要的功能:

下面是一个建议的例子,正如上面的链接所示。如您所见,youtube dl仅用于获取视频URL,ffmpeg执行以下任务:

ffmpeg -i $(youtube-dl -f 22 --get-url https://www.youtube.com/watch?v=ZbZSe6N_BXs) -ss 00:00:10 -t 00:00:30 -c:v copy -c:a copy happy.mp4
以类似方式启动ffmpeg并下载一段3h视频的示例:

import youtube_dl, subprocess

URL = "https://www.youtube.com/watch?v=eyU3bRy2x44"
FROM = "00:00:15"
TO = "00:00:25"
TARGET = "demo.mp4"

with youtube_dl.YoutubeDL({'format': 'best'}) as ydl:
    result = ydl.extract_info(URL, download=False)
    video = result['entries'][0] if 'entries' in result else result

url = video['url']
subprocess.call('ffmpeg -i "%s" -ss %s -t %s -c:v copy -c:a copy "%s"' % (url, FROM, TO, TARGET))


非常有趣。“用户-代理…”行的添加标题是什么?是模拟浏览器交互吗?用户代理告诉服务器它处理的是什么浏览器。这个服务器不允许我下载默认的python版本。谢谢。我通常使用请求,但在那里似乎也有可能。这可能会让我有一段时间安全,当我刮掉一些恶意的网站,拒绝我的请求。非常有趣。“用户-代理…”行的添加标题是什么?是模拟浏览器交互吗?用户代理告诉服务器它处理的是什么浏览器。这个服务器不允许我下载默认的python版本。谢谢。我通常使用请求,但在那里似乎也有可能。这可能会让我安全一段时间,当我刮掉一些网站时,这些网站的恶意程度足以拒绝我的请求。请提供解决此问题的代码尝试。相关:请提供解决此问题的代码尝试。相关:嗯,但你注意到了吗,答案中的建议下载整个视频,然后重新编码?这不完全是他想要的。顺便说一句,另一个人也不是。但事实并非如此,我只是尝试了一下。不能像在Windows环境中那样执行命令,但我就是这么做的。首先通过运行youtube dl-f best-get URL>URL.txt获取URL,然后将ffmpeg与此URL副本一起使用粘贴表单URL.txt,它工作得非常好,只下载了必要的部分。我编辑了答案,其中包含一段使用youtube_dl的python代码,并启动了ffmpeg命令行。它工作得很好,从3小时的视频中下载几mb。哇,这是一个多么棒的解决方案。谢谢你,穆奇想给你投票,但我还没有15分的声望。我只想再次感谢你。嗯,但是你注意到了吗,答案中的建议下载了整个视频,然后重新编码?这不完全是他想要的。顺便说一句,另一个人也不是。但事实并非如此,我只是尝试了一下。不能像在Windows环境中那样执行命令,但我就是这么做的。首先通过运行youtube dl-f best-get URL>URL.txt获取URL,然后将ffmpeg与此URL副本一起使用粘贴表单URL.txt,它工作得非常好,只下载了必要的部分。我编辑了答案,其中包含一段使用youtube_dl的python代码,并启动了ffmpeg命令行。它工作得很好,从3小时的视频中下载几mb。哇,这是一个多么棒的解决方案。谢谢你,穆奇想给你投票,但我还没有15分的声望。我只想再次感谢你。看我的第二个答案,你可以用ffmpeg轻松地完成这项工作,它决定下载视频的哪些部分,并自行处理容器。看我的第二个答案,你可以用ffmpeg轻松地完成这项工作,它决定下载视频的哪些部分,并自行处理容器。