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

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

本文分享了一个名为‘space stills’的开源程序,可以用来查看NASA电视的直播画面(静止帧)。

目录

演讲地址:关于程序开发环境资源和依赖包NASA电视馈送流

计算机编程语言

第三方库

完全码

演示地址:

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

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

关于程序

Spacestills定期从feed流中下载NASA的电视静止画面,并在GUI中显示出来。

这个程序可以纠正帧的长宽比,并将其保存为PNG格式。它将自动下载最新的帧,并提供手动重装,禁用自动重装或改变下载频率的选项。

Spacestillsis是一个相对初级的版本,但它可以做一些有用的事情:捕捉和保存NASA电视台直播的太空事件的图像。太空爱好者经常在社交网络或论坛上分享他们从NASA电视上手动获得的屏幕截图。Spacestills使用屏幕捕获工具节省时间,并保存可以共享的图像文件。你可以在Replit上在线运行Spacestills。

开发环境

作者用Replit开发了Spacestills。Replit是一个基于云的开发、部署和协作环境。它支持包括Python在内的数十种编程语言和框架。作为Chrome操作系统和云计算的爱好者,我非常喜欢Replit,因为它可以在浏览器中正常运行,不需要下载和安装任何东西。

和资源依赖包。

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

美国国家航空航天局馈送流

在肯尼迪航天中心的网站上有一个网页,其中包含了美国航天局的视频流选集,包括美国航天局的电视公共频道。提要显示最新的静止帧并自动更新。

每个馈送都有三种大小的帧,Spacestills依赖于最大的NASA电视馈送流,具有704x408像素帧。最大更新频率是每45秒一次。因此,检索最新的静止帧就像从提要流的URL下载JPEG图像一样简单。

原图纵向拉伸,看起来很奇怪。因此,该程序可以通过压缩图像并生成不失真的16: 9版本来校正纵横比。

计算机编程语言

由于PySimpleGUI,需要安装Python版。

第三方库

枕头:图像处理

PySimpleGUI:GUI框架(Spacestills使用Tkinter后端)

请求:HTTP请求

完整代码

fromioimportBytesIO

fromdatetimeimportdatetime,timedelta

frompathlibimportPath

导入请求

from requests . exceptionsimporttime out

fromPILimportImage

importPySimpleGUIassg

FEED _ URL=' https://science . KSC . NASA . gov/shuttle/count down/video/chan 2 large . jpg '

# framesizewithouttandwith 16:9 aspectaticorrection

宽度=704

身高=480

身高_16_9=396

#Minimum、default和maximumautoreloadtintervalinseconds

最小增量=45

增量=最小增量

MAX_DELTA=300

classStillFrame():

' ' Holdsastillframe。

imageisstoredasapngpil . imageandkeptinpngformat。

属性

-

图片:PIL。图像

静态框架

原作:PIL。图像

originalframewithwiththeinstance已初始化,cachedincaseof

调整其他原始尺寸

方法

-

字节:Returntherawbytes

调整大小:调整屏幕截图

new _ size:calculatenewaspecratio

'''

def__init__(self,image):

' ' ' converttheimagetopengandcacheconvertedoriginal。

因素

-

图片:PIL。图像

Imagetostore

'''

自我形象=形象

自我。_topng()

self.original=自我形象

def_topng(self):

' ' ' ' ConvertimageformatofframetoPNG。

返回

-

静止框架

framewithgimageinpngformat

'''

ifnotself.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

回归自我

defbytes(自身):

' ' Returnrawbytesofaframeimage。

返回

-

字节

Bytestreamoftheframeimage

'''

file=BytesIO()

self.image.save(文件,“png”)

file.seek(0)

returnfile.read()

defnew_size(self):

' ' ' returnimagesizetoggledbutoriginaland 16:9。

返回

-

二元组

新尺寸

'''

size=self.image.size

original _ size=self . original . size

new_size=(WIDTH,HEIGHT _ 16 _ 9)if size==original _ sizeelse(WIDTH,HEIGHT)

returnnew_size

defresize(self,new_size):

""调整帧图像的大小。

因素

-

新尺寸:2元组

新尺寸

返回

-

静止框架

Framewithimageresized

'''

如果不是(自我。形象。size==new _ size):

自我。形象=自我。形象。调整大小(新大小)

回归自我

defmake _ blank _ image(size=(WIDTH,HEIGHT)):

' ' '用蓝色背景创建一个蓝色图像。

因素

-

大小:二元组

图象尺寸

返回

-

PIL .图像

空白图像

'''

image=Image.new('RGB ',size=size,color='blue ')

返回图像

定义下载图像(网址):

' ' ' DownloadcurrentNASATVimage .

因素

-

url:str

URLtodownloadtheimagefrom

返回

-

PIL .图像

Downloadedimageifnoerrors,otherwiseblankimage

'''

尝试:

response=requests.get(url,timeout=(0.5,0.5))

ifresponse.status_code==200:

图像=图像。open(BytesIO(响应。内容))

否则:

image=make_blank_image()

异常超时:

image=make_blank_image()

返回图像

defrefresh(window,resize=False,feed=FEED_URL):

' ' '显示最新stillframeinwindow .

因素

-

窗口:sg .窗户

Windowtodisplaythestillto

馈送:字符串

FeedURL

返回

-

静止框架

刷新屏幕截图

'''

静止=静止帧(下载_图像(提要))

ifresize:

still=change _ aspect _ ratio(window,still,new_size=(WIDTH,HEIGHT_16_9))

否则:

窗口['-图像-']。update(data=still.bytes())

returnstill

defchange_aspect_ratio(window,still,new_size=(WIDTH,HEIGHT_16_9)):

''更改stilldisplayedinwindow的外观。

因素

-

窗口:sg .窗户

Windowcontainingthestill

新尺寸:2元组

新尺寸蒸馏器

返回

-

静止框架

框架包含大小尺寸图像

'''

调整大小_静止=静止。调整大小(新大小)

窗口['-图像-']。update(data=resized _ still。bytes())

returnresized_still

defsave(静止,路径):

' ' '保存静态文件。

因素

-

静止:静止帧

斯蒂尔托萨维

路径:字符串

文件名

返回

-

布尔代数学体系的

Trueiffilesavedwithnoerrors

'''

文件名=路径(路径)

尝试:

withopen(文件名,' wb ')作为文件:

file.write(still.bytes())

保存=真

异常错误:

保存=假

返回保存的

defnext_timeout(增量):

' ' returnthementtimerightnow deltasecondsfromnow .

因素

-

增量:整数

timeinsecondsuntilthenexttime out

返回

-

日期时间。日期时间

Momentintimeofthenexttimeout

'''

rightnow=datetime.now()

returnrightnow时间增量(秒=delta)

deftimeout_due(next_timeout):

' '如果thenexttimeoutisdue,则返回true .

因素

-

下一个_超时:日期时间。日期时间

返回

-

弯曲件

Trueifthenexttimeoutisdue

'''

rightnow=datetime.now()

returnrightnow=next_timeout

defvalidate_delta(值):

checkifvalueisaintwithintheperrangeforatimedelta .

因素

-

值:int

timeinsecondsuntilthenexttime out

返回

-

(同国际组织)国际组织

timeinsecondsuntilthenexttime out

弯曲件

true ifheargumentisavalititimedelta

'''

isinteger=False

尝试:

is integer=type(int(value))isint

例外例外:

delta=DELTA

delta=int(value)ifisintegerelsedelta

有效=最小增量=增量=最大增量

delta=deltaifisvalidelseDELTA

returndelta,isintegerandisvalid

布局=[[sg .Image(key='-IMAGE-')],

【sg .checkbox(' correctaspecratio ',key='-RESIZE-',enable_events=True),

sg .按钮('重新加载,key='-重新加载-'),

sg .按钮('保存,key='-保存-'),

sg .Exit()],

【sg .复选框('自动重新加载间隔(秒):',key='-自动重新加载-',

默认值=真),

sg .Input(DELTA,key='-DELTA-',size=(3,1),justification='right '),

sg .Button('Set ',key='-UPDATE_DELTA-')]]

defmain(布局):

''运行事件循环'''

窗口=sg .窗口(‘太空堡垒’,布局,finalize=True)

当前_静止=刷新(窗口)

delta=DELTA

next _ reload _ time=日期时间。现在()时间增量(秒=delta)

whileTrue:

event,values=window.read(timeout=100)

干扰素(sg .WIN_CLOSED,' Exit '):

破裂

elif((event=='-RELOAD-')或

(值['-自动重新加载-']和timeout_due(next_reload_time))):

current_still=refresh(window,values['-RESIZE-'])

如果值['-自动重新加载-']:

下一次重新加载时间=下一次超时(增量)

elifevent=='-RESIZE-':

current _ still=change _纵横比(

window,current_still,current_still.new_size())

elifevent=='-SAVE-':

filename=sg.popup_get_file(

' Filename ',file_types=[('PNG ',' * .png')],save_as=True,

title='Saveimage ',default_extension=' .png’)

文件名:

saved=save(当前_静止,文件名)

如果未保存:

SG。popup _ ok(' Errorwhilesavingfile:',filename,title='Error ')

elifevent=='-UPDATE_DELTA-':

# thecurrentcycleshouldcompleteatthealdyscheduledtime .因此

#不要更新_ reload _,因为它会导致

#下一个-自动重新加载或重新加载-事件。

,valid=validate_delta(值['-DELTA-'])

ifnotvalid:

窗口['-DELTA-'].更新(字符串(增量))

window.close()

德尔窗口

if__name__=='__main__ ':

主要(布局)

以上就是用计算机编程语言监控美国宇航局电视台直播画面的实现步骤的详细内容,更多关于计算机编程语言监控美国宇航局电视台直播画面的资料请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: