我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用Python监控NASA TV直播画面的实现步骤

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用Python监控NASA TV直播画面的实现步骤

目录
  • 演示地址:
  • 关于程序
  • 开发环境
  • 资源和依赖包
    • NASA TV feed 流
    • Python
    • 第三方库
  • 完整代码

    演示地址:

    https://replit.com/@PaoloAmoroso/spacestills

    这是一个具有GUI的简单系统,它访问feed流并从Web下载数据。该程序仅需350行代码,并依赖于一些开源的Python库。

    关于程序

    Spacestills会定期从feed流中下载NASA TV静止帧并将其显示在GUI中。
    该程序可以校正帧的纵横比,并将其保存为PNG格式。它会自动下载最新的帧,并提供手动重新加载,禁用自动重新加载或更改下载频率的选项。
    Spacestillsis是一个比较初级的版本,但是它可以做一些有用的事情:捕获并保存NASA TV直播的太空事件图像。太空爱好者经常在社交网络或论坛共享他们从NASA TV手动获取的屏幕截图。Spacestills节省了使用屏幕捕获工具的时间,并保存了可供共享的图像文件。您可以在Replit上在线运行Spacestills。

    开发环境

    笔者用Replit开发了Spacestills。Replit是云上的开发,部署和协作环境,它支持包括Python在内的数十种编程语言和框架。作为Chrome操作系统和云计算爱好者,笔者非常喜欢Replit,因为它可以在浏览器中完全正常运行,无需下载或安装任何内容。

    资源和依赖包

    Spacestills依赖于一些外部资源和Python库。

    NASA TV feed 流

    肯尼迪航天中心的网站上有一个页面,其中包含精选的NASA视频流,包括NASA电视公共频道。feed流显示最新的静止帧并自动更新。
    每个feed都带有三种尺寸的帧,Spacestills依赖于具有704x408像素帧的最大NASA TV feed流。最大更新频率为每45秒一次。因此,检索最新的静止帧就像从feed流的URL下载JPEG图像一样简单。
    原始图像被垂直拉伸,看起来很奇怪。因此,该程序可以通过压缩图像并生成未失真的16:9版本来校正纵横比。

    Python

    因PySimpleGUI的原因需要安装 Python 3.6 版本。

    第三方库

    • Pillow:图像处理
    • PySimpleGUI:GUI框架(Spacestills使用Tkinter后端)
    • Request:HTTP请求

    完整代码

    
    from io import BytesIO
    from datetime import datetime, timedelta
    from pathlib import Path
    import requests
    from requests.exceptions import Timeout
    from PIL import Image
    import PySimpleGUI as sg
    
    
    FEED_URL = 'https://science.ksc.nasa.gov/shuttle/countdown/video/chan2large.jpg'
    
    # Frame size without and with 16:9 aspect ratio correction
    WIDTH = 704
    HEIGHT = 480
    HEIGHT_16_9 = 396
    
    # Minimum, default, and maximum autoreload interval in seconds
    MIN_DELTA = 45
    DELTA = MIN_DELTA
    MAX_DELTA = 300
    
    
    class StillFrame():
        """Holds a still frame.
        
        The image is stored as a PNG PIL.Image and kept in PNG format.
        Attributes
        ----------
            image : PIL.Image
                A still frame
            original : PIL.Image
                Original frame with wchich the instance is initialized, cached in case of
                resizing to the original size
        
        Methods
        -------
            bytes : Return the raw bytes
            resize : Resize the screenshot
            new_size : Calculate new aspect ratio
        """
    
        def __init__(self, image):
            """Convert the image to PNG and cache the converted original.
            Parameters
            ----------
                image : PIL.Image
                    Image to store
            """
            self.image = image
            self._topng()
            self.original = self.image
    
        def _topng(self):
            """Convert image format of frame to PNG.
            Returns
            -------
                StillFrame
                    Frame with image in PNG format
            """
            if not self.image.format == 'PNG':
                png_file = BytesIO()
                self.image.save(png_file, 'png')
                png_file.seek(0)
                png_image = Image.open(png_file)
                self.image = png_image
            return self
    
        def bytes(self):
            """Return raw bytes of a frame image.
            
            Returns
            -------
                bytes
                    Byte stream of the frame image
            """
            file = BytesIO()
            self.image.save(file, 'png')
            file.seek(0)
            return file.read()
    
        def new_size(self):
            """Return image size toggled between original and 16:9.
            
            Returns
            -------
                2-tuple
                    New size
            """
            size = self.image.size
            original_size = self.original.size
            new_size = (WIDTH, HEIGHT_16_9) if size == original_size else (WIDTH, HEIGHT)
            return new_size
    
        def resize(self, new_size):
            """Resize frame image.
            
            Parameters
            ----------
                new_size : 2-tuple
                    New size
            Returns
            -------
                StillFrame
                    Frame with image resized
            """
            if not(self.image.size == new_size):
                self.image = self.image.resize(new_size)
            return self
        
    
    def make_blank_image(size=(WIDTH, HEIGHT)):
        """Create a blank image with a blue background.
        
        Parameters
        ----------
            size : 2-tuple
                Image size
        
        Returns
        -------
            PIL.Image
                Blank image
        """
        image = Image.new('RGB', size=size, color='blue')
        return image
    
    
    def download_image(url):
        """Download current NASA TV image.
        Parameters
        ----------
            url : str
                URL to download the image from
        
        Returns
        -------
            PIL.Image
                Downloaded image if no errors, otherwise blank image
        """
        try:
            response = requests.get(url, timeout=(0.5, 0.5))
            if response.status_code == 200:
                image = Image.open(BytesIO(response.content))
            else:
                image = make_blank_image()
        except Timeout:
            image = make_blank_image()
        return image
    
    
    def refresh(window, resize=False, feed=FEED_URL):
        """Display the latest still frame in window.
        
        Parameters
        ----------
            window : sg.Window
                Window to display the still to
            feed : string
                Feed URL
        
        Returns
        -------
            StillFrame
                Refreshed screenshot
        """
        still = StillFrame(download_image(feed))
        if resize:
            still = change_aspect_ratio(window, still, new_size=(WIDTH, HEIGHT_16_9))
        else:
            window['-IMAGE-'].update(data=still.bytes())
        return still
    
    
    def change_aspect_ratio(window, still, new_size=(WIDTH, HEIGHT_16_9)):
        """Change the aspect ratio of the still displayed in window.
        
        Parameters
        ----------
            window : sg.Window
                Window containing the still
            new_size : 2-tuple
                New size of the still
        
        Returns
        -------
            StillFrame
                Frame containing the resized image
        """
        resized_still = still.resize(new_size)
        window['-IMAGE-'].update(data=resized_still.bytes())
        return resized_still
    
    
    def save(still, path):
        """Save still to a file.
        Parameters
        ----------
            still : StillFrame
                Still to save
            path : string
                File name
        
        Returns
        -------
            Boolean
                True if file saved with no errors
        """
        filename = Path(path)
        try:
            with open(filename, 'wb') as file:
                file.write(still.bytes())
            saved = True
        except OSError:
            saved = False
        return saved
    
    
    def next_timeout(delta):
        """Return the moment in time right now + delta seconds from now.
        Parameters
        ----------
            delta : int
                Time in seconds until the next timeout
        
        Returns
        -------
            datetime.datetime
                Moment in time of the next timeout
        """
        rightnow = datetime.now()
        return rightnow + timedelta(seconds=delta)
    
    
    def timeout_due(next_timeout):
        """Return True if the next timeout is due.
        Parameters
        ----------
            next_timeout : datetime.datetime
        
        Returns
        -------
            bool
                True if the next timeout is due
        """
        rightnow = datetime.now()
        return rightnow >= next_timeout
    
    
    def validate_delta(value):
        """Check if value is an int within the proper range for a time delta.
        Parameters
        ----------
            value : int
                Time in seconds until the next timeout
        
        Returns
        -------
            int
                Time in seconds until the next timeout
            bool
                True if the argument is a valid time delta
        """
        isinteger = False
        try:
            isinteger = type(int(value)) is int
        except Exception:
            delta = DELTA
        delta = int(value) if isinteger else delta
        isvalid = MIN_DELTA <= delta <= MAX_DELTA
        delta = delta if isvalid else DELTA
        return delta, isinteger and isvalid
    
    
    LAYOUT = [[sg.Image(key='-IMAGE-')],
              [sg.Checkbox('Correct aspect ratio', key='-RESIZE-', enable_events=True),
               sg.Button('Reload', key='-RELOAD-'),
               sg.Button('Save', key='-SAVE-'),
               sg.Exit()],
              [sg.Checkbox('Auto-reload every (seconds):', key='-AUTORELOAD-',
                           default=True),
               sg.Input(DELTA, key='-DELTA-', size=(3, 1), justification='right'),
               sg.Button('Set', key='-UPDATE_DELTA-')]]
    
    
    def main(layout):
        """Run event loop."""
        window = sg.Window('Spacestills', layout, finalize=True)
        current_still = refresh(window)
    
        delta = DELTA
        next_reload_time = datetime.now() + timedelta(seconds=delta)
    
        while True:
            event, values = window.read(timeout=100)
            if event in (sg.WIN_CLOSED, 'Exit'):
                break
            elif ((event == '-RELOAD-') or
                    (values['-AUTORELOAD-'] and timeout_due(next_reload_time))):
                current_still = refresh(window, values['-RESIZE-'])
                if values['-AUTORELOAD-']:
                    next_reload_time = next_timeout(delta)
            elif event == '-RESIZE-':
                current_still = change_aspect_ratio(
                    window, current_still, current_still.new_size())
            elif event == '-SAVE-':
                filename = sg.popup_get_file(
                    'File name', file_types=[('PNG', '*.png')], save_as=True,
                    title='Save image', default_extension='.png')
                if filename:
                    saved = save(current_still, filename)
                    if not saved:
                        sg.popup_ok('Error while saving file:', filename, title='Error')
            elif event == '-UPDATE_DELTA-':
                # The current cycle should complete at the already scheduled time. So
                # don't update next_reload_time yet because it'll be taken care of at the
                # next -AUTORELOAD- or -RELOAD- event.
                delta, valid = validate_delta(values['-DELTA-'])
                if not valid:
                    window['-DELTA-'].update(str(DELTA))
    
        window.close()
        del window
    
    
    if __name__ == '__main__':
        main(LAYOUT)

    以上就是用 Python 监控 NASA TV 直播画面的实现步骤的详细内容,更多关于Python 监控 NASA TV 直播画面的资料请关注编程网其它相关文章!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    用Python监控NASA TV直播画面的实现步骤

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    用Python监控NASA TV直播画面的实现步骤

    目录演示地址:关于程序开发环境资源和依赖包NASA TV feed 流Python第三方库完整代码演示地址:https://replit.com/@PaoloAmoroso/spacestills这是一个具有GUI的简单系统,它访问feed
    2022-06-02

    怎么用 Python 监控 NASA TV 直播画面

    本篇内容主要讲解“怎么用 Python 监控 NASA TV 直播画面”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用 Python 监控 NASA TV 直播画面”吧! 本文分享一个名为"
    2023-06-15

    用python实现域名资产监控的步骤是什么

    本篇文章给大家分享的是有关用python实现域名资产监控的步骤是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。应用场景域名资产监控,通过输入一个主域名,找到该域名对应的ip
    2023-06-25

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录