用于录制在线直播视频的 Python 脚本



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

我的脚本:

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 文件中。

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

任何人都可以在这里分享您的知识来解决我的问题。

提前谢谢。

我认为

如果不不断分析视频,就没有任何方法可以做到这一点,这将是昂贵的。因此,您可以猜测需要多少MB,一旦完成检查它是否足够长。如果太长,就剪掉它。除了猜测之外,您还可以建立一些需要检索量的统计信息。您也可以将 while True 替换为:

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

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

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()

您可以使用"内容长度"标头来检索视频文件大小(如果存在)。

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

相关内容

  • 没有找到相关文章

最新更新