【问题标题】:python script to record online live streaming videos用于录制在线直播视频的python脚本
【发布时间】:2012-04-30 18:08:17
【问题描述】:

我正在开发一个脚本来下载在线直播视频。

我的脚本:

print "Recording video..."
response = urllib2.urlopen("streaming online video url")
filename = time.strftime("%Y%m%d%H%M%S",time.localtime())+".avi"
f = open(filename, 'wb')

video_file_size_start = 0  
video_file_size_end = 1048576 * 7  # end in 7 mb 
block_size = 1024

while True:
    try:
        buffer = response.read(block_size)
        if not buffer:
            break
        video_file_size_start += len(buffer)
        if video_file_size_start > video_file_size_end:
            break
        f.write(buffer)

    except Exception, e:
        logger.exception(e)
f.close()

上面的脚本可以很好地从实时流媒体内容中下载 7Mb 的视频并将其存储到 *.avi 文件中。

但是,无论文件大小如何,我都想只下载 10 秒的视频并将其存储在 avi 文件中。

我尝试了不同的可能性,但没有成功。

谁能在这里分享你的知识来解决我的问题。

提前致谢。

【问题讨论】:

  • 我正在尝试做同样的事情,抓取视频流。有没有你遵循的教程来帮助你写这个?甚至我可以使用的测试流媒体 URL 也会有很好的帮助。
  • 发现您的代码对项目很有帮助。我正在使用请求,但它似乎以相同的方式工作。谢谢!
  • 10 秒视频的大小是多少(我假设您能够解决问题)
  • 好的,在 Windows 64 上运行你的脚本,文件正在创建,但是当我尝试播放它时,它的持续时间为 0 秒。它为你运行?我应该更改格式吗?

标签: python video stream video-streaming


【解决方案1】:

如果不不断分析视频,我认为没有任何方法可以做到这一点,这将是一种代价高昂的方式。所以你可以猜测你需要多少MB,一旦完成检查它是否足够长。如果它太长,只需剪掉它。除了猜测之外,您还可以建立一些关于您需要检索多少的统计数据。您也可以将 while True 替换为:

start_time_in_seconds = time.time()
time_limit = 10
while time.time() - start_time_in_seconds < time_limit:
    ...

这应该为您提供至少 10 秒的视频,除非连接需要太多时间(然后少于 10 秒)或服务器发送更多用于缓冲(但这不太可能用于实时流)。

【讨论】:

    【解决方案2】:

    您可以使用“Content-Length”标头来检索视频文件大小(如果存在)。

    video_file_size_end = response.info().getheader('Content-Length')
    

    【讨论】:

      【解决方案3】:

      response.read() 不起作用。 response.iter_content() 似乎可以解决问题。

      import time
      import requests
      
      
      print("Recording video...")
      filename = time.strftime("/tmp/" + "%Y%m%d%H%M%S",time.localtime())+".avi"
      file_handle = open(filename, 'wb')
      chunk_size = 1024
      
      start_time_in_seconds = time.time()
      
      time_limit = 10 # time in seconds, for recording
      time_elapsed = 0
      url = "http://demo.codesamplez.com/html5/video/sample"
      with requests.Session() as session:
          response = session.get(url, stream=True)
          for chunk in response.iter_content(chunk_size=chunk_size):
              if time_elapsed > time_limit:
                  break
              # to print time elapsed   
              if int(time.time() - start_time_in_seconds)- time_elapsed > 0 :
                  time_elapsed = int(time.time() - start_time_in_seconds)
                  print(time_elapsed, end='\r', flush=True)
              if chunk:
                  file_handle.write(chunk)
      
          file_handle.close()
      

      【讨论】:

      • 嘿@patel deven!做得好!我正在尝试运行您的代码并插入一个指向我要下载的视频的链接 - 我得到一个 .avi 文件,但它的长度为 0 秒。不知道你的文件和我的有什么区别。我刚刚尝试了一个 youtube 文件。
      猜你喜欢
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多