成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

用Python監控NASA TV直播畫面的實現步驟

瀏覽:3日期:2022-06-19 09:12:44
目錄演示地址:關于程序開發環境資源和依賴包NASA TV feed 流Python第三方庫完整代碼演示地址:

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

用Python監控NASA TV直播畫面的實現步驟

這是一個具有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 BytesIOfrom datetime import datetime, timedeltafrom pathlib import Pathimport requestsfrom requests.exceptions import Timeoutfrom PIL import Imageimport PySimpleGUI as sgFEED_URL = ’https://science.ksc.nasa.gov/shuttle/countdown/video/chan2large.jpg’# Frame size without and with 16:9 aspect ratio correctionWIDTH = 704HEIGHT = 480HEIGHT_16_9 = 396# Minimum, default, and maximum autoreload interval in secondsMIN_DELTA = 45DELTA = MIN_DELTAMAX_DELTA = 300class 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 frameoriginal : PIL.Image Original frame with wchich the instance is initialized, cached in case of resizing to the original sizeMethods -------bytes : Return the raw bytesresize : Resize the screenshotnew_size : Calculate new aspect ratio ''' def __init__(self, image):'''Convert the image to PNG and cache the converted original.Parameters---------- image : PIL.ImageImage to store'''self.image = imageself._topng()self.original = self.image def _topng(self):'''Convert image format of frame to PNG.Returns------- StillFrameFrame 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_imagereturn self def bytes(self):'''Return raw bytes of a frame image.Returns------- bytesByte 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-tupleNew size'''size = self.image.sizeoriginal_size = self.original.sizenew_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-tupleNew sizeReturns------- StillFrameFrame 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 sizeReturns -------PIL.Image Blank image ''' image = Image.new(’RGB’, size=size, color=’blue’) return imagedef download_image(url): '''Download current NASA TV image. Parameters ----------url : str URL to download the image fromReturns -------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 imagedef refresh(window, resize=False, feed=FEED_URL): '''Display the latest still frame in window.Parameters ----------window : sg.Window Window to display the still tofeed : string Feed URLReturns -------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 stilldef 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 stillnew_size : 2-tuple New size of the stillReturns -------StillFrame Frame containing the resized image ''' resized_still = still.resize(new_size) window[’-IMAGE-’].update(data=resized_still.bytes()) return resized_stilldef save(still, path): '''Save still to a file. Parameters ----------still : StillFrame Still to savepath : string File nameReturns -------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 saveddef next_timeout(delta): '''Return the moment in time right now + delta seconds from now. Parameters ----------delta : int Time in seconds until the next timeoutReturns -------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.datetimeReturns -------bool True if the next timeout is due ''' rightnow = datetime.now() return rightnow >= next_timeoutdef 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 timeoutReturns -------int Time in seconds until the next timeoutbool 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 isvalidLAYOUT = [[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’): breakelif ((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 windowif __name__ == ’__main__’: main(LAYOUT)

以上就是用 Python 監控 NASA TV 直播畫面的實現步驟的詳細內容,更多關于Python 監控 NASA TV 直播畫面的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品日产欧美久久久久| 中文欧美日韩| 欧美日韩在线一二三 | 欧美日韩在线大尺度| 高清久久久久久| 在线视频国内一区二区| 亚洲h在线观看| 国产欧美一区二区色老头 | 亚洲高清在线视频| 亚洲精品人人| 1000部国产精品成人观看| 欧美激情91| 久久久久综合网| 成人av网址在线| 精品日韩成人av| 粉嫩一区二区三区性色av| 欧美一卡二卡三卡| 国产盗摄女厕一区二区三区| 7878成人国产在线观看| 国产麻豆视频精品| 69p69国产精品| 国产剧情一区在线| 日韩一区二区三区电影在线观看| 国产精一品亚洲二区在线视频| 欧美欧美午夜aⅴ在线观看| 国内一区二区在线| 91精选在线观看| 粉嫩嫩av羞羞动漫久久久| 3d动漫精品啪啪一区二区竹菊| 韩国视频一区二区| 91精品欧美福利在线观看| 国产成人综合在线播放| 日韩精品一区二区三区中文精品| 成人a区在线观看| 久久久久久**毛片大全| 欧美少妇一区| 亚洲精品日韩综合观看成人91| 一本一道久久综合狠狠老精东影业| 亚洲一区二区影院| 久久一区欧美| 国产九色精品成人porny| 欧美一区二区三区日韩| a美女胸又www黄视频久久| 国产欧美日韩久久| 亚洲久久成人| 日本欧美一区二区| 在线播放/欧美激情| 成人av资源在线观看| 国产三级欧美三级| 亚洲国产精品毛片| 午夜精品一区二区三区电影天堂 | 精品处破学生在线二十三| 欧美日韩高清免费| 亚洲精品日韩综合观看成人91| 国产农村妇女精品一二区| 爽好久久久欧美精品| 欧美日韩国产123区| 成人精品免费网站| 中文字幕一区二| 久久伊人一区二区| 国产suv精品一区二区883| 国产精品免费久久| 久久av免费一区| 久久狠狠亚洲综合| 久久日一线二线三线suv| 9国产精品视频| 激情图片小说一区| 久久九九99视频| 亚洲永久字幕| 国产一区不卡在线| 国产欧美一区二区精品仙草咪| 国产视频精品网| 国产一区三区三区| 日本一区二区高清| 久久激情久久| 国产69精品久久777的优势| 国产亚洲欧美日韩俺去了| 性欧美xxxx大乳国产app| 韩国视频一区二区| 国产精品乱码妇女bbbb| 在线观看免费亚洲| 色综合视频在线观看| 亚洲图片欧美综合| 日韩美女视频一区二区在线观看| 在线日韩av永久免费观看| 蜜臀久久久99精品久久久久久| 亚洲精品一区二区在线观看| 亚洲在线国产日韩欧美| 岛国精品在线播放| 亚洲一区二区三区美女| 在线播放视频一区| 亚洲美女91| 国产在线精品免费| 亚洲欧洲三级电影| 欧美精品tushy高清| 另类调教123区| 久久一区二区三区国产精品| 中文日韩在线| 国产乱码精品一区二区三区五月婷| 欧美国产日韩在线观看| 色视频成人在线观看免| 91丨porny丨在线| 日韩中文字幕1| 国产日韩欧美a| 在线观看免费视频综合| 国产尤物精品| 精品一区二区三区在线观看| 1024国产精品| 91麻豆精品国产91久久久久久 | 色综合久久综合网97色综合 | 欧美男同性恋视频网站| 欧美99在线视频观看| 视频一区二区不卡| 久久婷婷国产综合精品青草| 色8久久精品久久久久久蜜| 欧美日韩综合网| 麻豆久久一区二区| 最新国产成人在线观看| 日韩三级视频在线看| 久久九九免费| 国产一区日韩欧美| 成人一级视频在线观看| 日韩av不卡在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 56国语精品自产拍在线观看| 免费一级欧美片在线播放| 欧美日韩国内| 国产成人综合在线| 全国精品久久少妇| 亚洲激情欧美激情| 国产亚洲成av人在线观看导航 | 亚洲欧美另类图片小说| 精品久久一二三区| 欧美性极品少妇| 亚洲综合另类| 国产精品久久7| 99久久精品免费看国产| 在线视频免费在线观看一区二区| 亚洲精品一级| 99r精品视频| 国产一区二区免费视频| 午夜精品久久久久久久久久| 亚洲欧洲日产国码二区| 日韩一区二区三| 欧美性大战久久| 噜噜噜在线观看免费视频日韩 | 日韩精品一卡二卡三卡四卡无卡| 国产精品久久久久久一区二区三区 | 亚洲高清视频一区二区| 91一区二区三区在线播放| 久久爱www久久做| 五月天一区二区| 亚洲午夜激情av| 亚洲日本在线a| 中文一区一区三区高中清不卡| xf在线a精品一区二区视频网站| 欧美色图一区二区三区| 欧美三级韩国三级日本三斤| 国产黄色精品视频| 青青青伊人色综合久久| 亚洲永久精品国产| 亚洲欧美日韩国产成人精品影院| 国产日韩欧美综合一区| 精品国产免费一区二区三区四区 | 国内偷窥港台综合视频在线播放| 亚洲大片一区二区三区| 亚洲黄色免费电影| 亚洲久草在线视频| 亚洲图片你懂的| 亚洲视频免费在线观看| 国产精品伦一区| 国产精品久久久久婷婷| 国产精品国产三级国产aⅴ中文| 免费观看30秒视频久久| 久久综合九色综合97_久久久| 日韩一区二区在线播放| 欧美一区二区日韩| 在线成人高清不卡| 91精品国产综合久久福利| 欧美日韩高清不卡| 欧美久久一二区| 777亚洲妇女| 欧美一级片在线| 欧美成人a∨高清免费观看| 欧美不卡在线视频| 久久蜜臀精品av| 久久久不卡网国产精品一区| 久久久精品2019中文字幕之3| 久久精品视频一区二区三区| 国产片一区二区| 中文字幕一区二区三区在线播放| 亚洲天堂网中文字| 一区二区三区日韩欧美精品| 一区二区免费在线播放| 亚洲国产精品久久久男人的天堂 | 狠狠色狠狠色合久久伊人| 国产又黄又大久久| 国产**成人网毛片九色| 91麻豆国产福利在线观看| 国产一区视频观看|