【问题标题】:Download the second half of a video using http's Range header使用 http 的 Range 标头下载视频的后半部分
【发布时间】:2017-02-26 15:07:31
【问题描述】:

我想下载我在本地主机上的视频的后半部分,我写了一些 python 代码来下载文件从一半开始到结束(通过 http 的 Range 标头)

但是当我用 vlc 打开文件时,什么也没有发生(所以它不起作用)

如何下​​载 mp4 文件的一部分并仍然可以观看?

import urllib2

file_url = 'http://127.0.0.1:8080/vid.mp4'

result = urllib2.urlopen(file_url)
cont_len = result.headers['content-length']
req = urllib2.Request(file_url)
req.headers['Range'] = 'bytes=%s-%s' % (str(int(int(cont_len) / 2)), str(int(cont_len)))

f = urllib2.urlopen(req)
File = open('2ndhalf.mp4', 'w')
File.write(f.read())

编辑:我的目的是更快地下载视频的一部分,而不是下载整个视频然后剪切它

【问题讨论】:

  • @falsetru 无论如何我可以为 mp4 文件制作标题吗?

标签: python video download mp4


【解决方案1】:

您需要下载完整的moov。从那里您可以获得中间帧的偏移量,然后您可以下载该帧以结束(假设帧是有序的,可能,但 mp4 不需要)。接下来仅使用您希望保留的条目重写moov,并确保调整所有偏移量以匹配新的块偏移量。

【讨论】:

  • 我编辑了我的问题,我的目的是不下载完整的视频,我正在做的部分工作是让事情尽可能快
  • 这不会改变答案。没有moovmdat 毫无用处
  • 从头开始下载,同时寻找moov。如果它不存在,您可以通过取消 http 请求并创建一个新请求来跳过框。如果不提出多个请求,在文件中搜索,就不可能完成您的要求。
  • 根据您的回复,我猜您不知道 mp4 的结构,有一个数据部分 (mdat) 和一个标题/索引部分 (moov) 您需要完整的moov 以阅读mdatmoov 比较小,可能在mdat 之前或之后。你需要先得到它。
  • @AbdallahSamman 之所以有效,是因为 FFmpeg 正在从裁剪文件的剩余帧中创建一个新的 moov 标头。您可能只是复制了原来的现有一个。但如果 FFmpeg 适合您...moov 包含图片大小、帧速率、关键帧位置等信息(正确播放视频所需的信息)。这就是为什么没有信息 VLC 无法播放的原因。
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2012-03-04
  • 2016-09-16
  • 2010-12-20
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多