分类 技术 下的文章

在这篇文章中,我将通过一些通俗易懂的例子来解释 Python 的 input() 函数的基础知识。

Python 是世界上最流行的编程语言之一,广泛应用于各种应用程序中。Python 中的一个基本概念是 input() 函数,它允许用户通过提供输入值与程序进行交互。

让我们看看 input() 函数是如何工作的,以及如何在 Python 程序中有效地使用它。

在开始之前,我希望你已经安装了 Python 并设置了一个基本的编辑器。如果没有,请参考我的以下指南:

Python Input 函数

Python 中的 input() 函数用于接受用户输入的字符串。它提示用户输入一个值并等待用户提供输入。然后将用户的输入作为字符串存储在变量中,稍后可以在程序中使用。

句法

input("your message to user")

当你运行 input() 函数时,它会向用户显示消息并 等待 输入。显示光标等待。当用户输入并按下回车键,input() 函数就会读取用户的输入。该值存储在你指定的变量中。

让我们看几个例子。

示例 1:简单的 input() 函数用法

以下代码片段接受输入并显示带有附加字符串的输出:

your_name = input("Enter your name:")
print("Hello " + your_name)

输出:

Enter your name:arindamHello arindam

Python 输入函数:一个简单的例子

示例 2:以整数和浮点数作为输入

在使用 input() 函数时,你还可以在运行时使用 int()float() 将输入转换。这是一个例子:

no_of_books = int(input("Enter total books ordered:"))
print ("Total number of books:", no_of_books)

price_of_each_book = float(input("Enter unit price:"))
print ("Total price:", no_of_books * price_of_each_book)

输出:

Enter total books ordered:5
Total number of books: 5
Enter unit price:10.1
Total price: 50.5

示例 3:连接列表

你还可以使用其他函数(例如列表)来接受一组值并将它们转换为 Python 中的 列表。这是一个接受输入并将其转换为列表的示例。然后使用另一组值并附加到第一个列表:

# 获取第一个列表的输入
list_1 = list(input("Enter numbers for list 1:"))

# 获取第二个列表的输入
list_2 = list(input("Enter some letters for list 2:"))

# 循环遍历第二个列表并添加到第一个列表
for j in list_2:
    list_1.append(j)

# 打印修改后的第一个列表
print(list_1)

输出:

Enter numbers for list 1:1234
Enter some letters for list 2:ABCD
['1', '2', '3', '4', 'A', 'B', 'C', 'D']

总结

我希望这个简单的指南通过几个示例阐明了 input() 函数。对于简单的场景,它是一个强大的功能,可以从标准输入中接受值。


via: https://www.debugpoint.com/input-function-python/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

什么是代理?

代理是充当客户端和另一台服务器之间的中介的服务器或软件应用。它充当客户端和互联网之间的网关,允许用户访问在线资源,同时隐藏他们的身份、位置和其他个人信息。

代理通常用于增强安全性和隐私,并为你的网络添加过滤器/防火墙。

有几种类型的代理,如 HTTP 代理、SOCKS 代理、透明代理等。

除非你在透明代理后面,否则检查起来毫不费力。在这里,我将讨论检测透明代理和常用代理的方法。

如何检查你是否在透明代理后面

虽然每种类型的代理都有其特性和功能,但如果它是透明代理,你将无法在客户端的 PC 上检测到它。这是因为透明代理在后台静默运行,拦截所有流量而不修改它。

有时,可能是你的互联网服务提供商和内容交付网络使用它们来缓存资源的副本以节省带宽或只是为了监视/过滤网络。

有几种方法可以检查你是否在透明代理后面:

  • 通过某些在线 IP 检测/检查网站获得的 IP 地址可能与你的计算机或设备的 IP 地址不匹配。因为代理服务器正在拦截你的流量并将其与 IP 地址一起发送出去。
  • 检查你的网络设置以查看是否配置了代理服务器。
  • 借助一些在线代理检测工具。
  • 连接到你知道不存在的服务器。 如果网页上显示的错误看起来与平时不同,你可能使用了代理。

无论你喜欢与否,你始终可以使用 VPN 服务 绕过透明代理。

如何检查你是否在 Ubuntu 上使用代理

Ubuntu 或任何其他 Linux 发行版提供了多种检查方法。此处使用运行 GNOME 的 Ubuntu 22.10。

使用 GNOME 设置

这是直接的 GUI 方式。打开 GNOME 设置 Settings 并转到 “ 网络 Networks ” 选项卡,然后按旁边的齿轮图标。

Select the gear icon adjacent to the Network proxy section

它应该默认 禁用 Disabled

如果你在代理后面,你可以在这里看到不同的状态。在代理设置中,你可以看到,我在这里使用了代理(手动配置)。

Proxy details in GNOME Settings

可以使用 GNOME 桌面中的 gsettings 命令更改相同的代理状态。

gsettings set org.gnome.system.proxy mode 'none'

你可以将 none 替换为 automanual。请记住,此设置是临时的,仅适用于当前用户。

使用命令行

你可以通过命令行以多种方式获取代理的状态。

通过列出关联的环境变量获取代理的状态

打开终端并运行以下任一命令:

env | grep -i proxy
cat /etc/environment | grep -i proxy
set | grep -i proxy

Using set command to check Proxy variables

空输出意味着没有配置代理。否则,它将打印相关的环境变量。

? 请注意,如果你将代理设置为环境变量,这将起作用。

或者,你可以回显每个代理变量以检查是否设置了特定的代理变量。

以下是你可以在终端中输入的内容:

echo $http_proxy
使用 nmcli 命令检查

打开终端并输入:

nmcli connection show

List all the connections using nmcli command

这将列出你的连接和关联的 UUID 编号。记下要检查的连接的 UUID 编号。然后使用命令:

nmcli connection show <UUID or name> | grep -i "proxy"

这将列出变量,你可以在其中记下代理服务器和端口。

Proxy details using nmcli command

总结

我希望本指南可以帮助你了解你是否在使用代理。

我必须提一下,并非所有代理配置都是恶意的。

但是,了解你的系统是否配置了代理很重要。


via: https://itsfoss.com/check-proxy-server/

作者:Sreenath 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

CrowPi 是一个超棒的树莓派项目系统,安装在一个笔记本电脑般的外壳里。

 title=

我喜欢历史,也喜欢计算机,因此相比于计算机如何变成个人配件,我更喜欢听它在成为日常家用电器前的故事。我经常听到的一个故事 是很久以前(反正在计算机时代算久远了)的计算机是多么的简单。事实上,它们简单到对于一个好奇的用户来说,弄清楚如何编程并不是十分困难。再看看现代计算机,它具有面向对象的编程语言、复杂的 GUI 框架、网络 API、容器等,但愈发令人担忧的是,计算工具正变得越来越难懂,对于那些没有接受过专门培训的人来说基本上无法使用。

从树莓派在 2012 年发布之日起,它就一直被定位为一个教育平台。一些第三方供应商通过附加组件和培训套件支持树莓派,以帮助所有年龄段的学习者探索编程、物理计算和开源。然而,直到最近,很大程度上还是要由用户来弄清楚市场上的所有部件如何组合在一起,直到我最近买了 CrowPi。

 title=

CrowPi2 介绍

乌鸦是非常聪明的鸟。它们能识别并记住面孔,模仿听到的声音,解决复杂的谜题,甚至使用工具来完成任务。CrowPi 使用乌鸦作为其徽标和名字是恰当的,因为这个设备充满了探索、实验、教育的机会,最重要的是,充满了乐趣。

其设计很巧妙:它看起来像笔记本电脑,但远不止于此。当你从机壳中取出蓝牙键盘时,它会显示一个隐藏的电子设备工坊,配有 LCD 屏幕、16 个按钮、刻度盘、RFID 传感器、接近传感器、线路板、扬声器、GPIO 连接、LED 阵列等等。而且这一切都是可编程的。

顾名思义,该装置本身完全由树莓派提供支持,它牢固地固定在机壳底部。

 title=

默认情况下,你应该用电源适配器为设备充电,包装附带一个壁式插头,你可以将其插入机壳,而不是直接为树莓派供电。你还可以使用插入外部微型 USB 端口的电池电源。机壳内甚至还有一个抽屉,方便你存放电池。这样做的时候,有一根 USB 线从电池抽屉中弹出,并插入机壳电源端口,因此你不会产生这是一台“普通”笔记本电脑的错觉。然而,这样一台设备能够有如此美观的设计已经很理想了!

首次启动系统

CrowPi2 提供一张安装了 Raspbian 系统,贴有 “System” 标签的 microSD 卡,不过它同时还提供了装载 RetroPie 的第二张 microSD 卡。作为一个负责任的成年人(咳咳),我自然是先启动了 RetroPie。

RetroPie 总是很有趣,CrowPi2 附带两个超任风格的游戏控制器,确保你能获得最佳的复古游戏体验。

令人赞叹不已的是,启动实际的 Raspbian 系统的过程同样有趣,甚至可以说更有趣。它的登录管理器是一个自定义项目中心,有一些快速链接,如编程示例项目、Python 和 Arduino IDE、Scratch、Python 示例游戏、Minecraft 等。你也可以选择退出项目中心,只使用桌面。

 title=

对于习惯使用树莓派或 Linux 的人来说,CrowPi 桌面很熟悉,不过它也足够简单,所以很容易上手。左上角有应用程序菜单,桌面上有快捷图标,右上角有网络选择和音量控制的系统托盘等等。

 title=

CrowPi 上有很多东西可供选择,所以你可能很难决定从哪里开始。对我来说,主要分为四大类:编程、物理电子学、Linux 和游戏。

盒子里有一本使用说明,所以你会知道你需要怎样进行连接(例如,键盘是电池供电的,所以它有时确实需要充电,它和鼠标总是需要一个 USB 适配器)。虽然说明书很快就能读完,但这一例子也充分体现了 CrowPi 团队是如何认真对待说明书的。

 title=

编程

如果你想学习如何编码,在 CrowPi 上有很多成功的途径。你可以从中选择你觉得最满意的路径。

1、Scratch

Scratch 是一个简单的可视化编码应用程序,可让你像拼 乐高积木 一样将代码块组合在一起,制作出游戏和互动故事。这是开启编程之旅最简单的方法,我曾见过年仅 8 岁的孩子会花数小时来研究自己设计的游戏的最佳算法。当然,它不仅适合孩子们!成年人也可以从中获得很多乐趣。不知道从哪里开始?包装盒中有一本 99 页的小册子(打印在纸张上),其中包含 Scratch 课程和项目供你尝试。

2、Java 和 Minecraft

Minecraft 不是开源的(虽然有 几个开源项目 复刻了它),但它有足够的可用资源,因此也经常被用来教授编程。Minecraft 是用 Java 编写的,CrowPi 同时装载有 Minecraft Pi EditionBlueJ Java IDE ,如此可使学习 Java 变得比以往更容易、更有趣。

3、Python 和 PyGame

CrowPi 上有几个非常有趣的游戏,它们是用 Python 和 PyGame 游戏引擎 编写的。你可以玩这些游戏,然后查看其源代码以了解游戏的运行方式。CrowPi 中包含 Geany、Thonny 和 Mu 编辑器,因此你可以使用 Python 立即开始编程。与 Scratch 一样,包装盒中有一本包含有课程的小册子,因此你可以学习 Python 基础知识。

电子器件

隐藏在键盘下的物理电子工坊本质上是一系列 Pi Hat(附着在上的硬件)。为了让你可以认识所有的组件,CrowPi 绘制了一张中英双语的折页图进行详细的说明。除此之外还有很多示例项目可以帮助你入门。 以下是一张小清单:

  • 你好:当你与 CrowPi 说话时,LCD 屏幕上打印输出“你好”。
  • 入侵警报:使用接近传感器发出警报。
  • 远程控制器:让你能够使用远程控制(是的,这个也包含在盒子里)来触发 CrowPi 上的事件。
  • RGB 俄罗斯方块:让你可以在 LED 显示屏上玩俄罗斯方块游戏。
  • 语音识别:演示自然语言处理。
  • 超声波音乐:利用距离传感器和扬声器创建简易版的 特雷门琴 Theramin (LCTT 译注:世上唯一不需要身体接触的电子乐器)。

这些项目仅仅是入门级别而已,因为你还可以在现有的基础上搭建更多东西。当然,还有更多内容值得探索。包装盒里还有网络跳线、电阻、LED 和各种组件,这样你闲暇时也可以了解树莓派的 GPIO (通用输入输出端口)功能的所有信息。

不过我也发现了一个问题:示例项目的位置有点难找。找到演示项目很容易(它们就在 CrowPi 中心上),但源代码的位置并不是很容易被找到。我后来发现大多数示例项目都在 /usr/share/code 中,你可以通过文件管理器或终端进行访问。

 title=

Linux

树莓派上运行的是 Linux 系统。如果你一直想更深入了解 Linux,那么 CrowPi 同样会是一个很好的平台。你可以探索 Linux 桌面、终端以及几乎所有 Linux 或开源应用程序。如果你多年来一直在阅读有关开源的文章,并准备深入研究开源操作系统,那么 CrowPi 会是你想要的平台(当然还有很多其他平台也可以)。

游戏

包装盒中包含的 RetroPie SD 卡意味着你可以重新启动切换为复古游戏机,并任意玩各种老式街机游戏。它跟 Steam Deck 并不完全相同,但也是一个有趣且令人振奋的小游戏平台。因为它配备的不是一个而是两个游戏控制器,所以它非常适合多人合作的沙发游戏。最重要的是,你不仅可以在 CrowPi 上玩游戏,还可以制作自己的游戏。

配备螺丝刀

自我坐下开始使用 CrowPi2 以来已经大约两周,但我还没有通关所有项目。有很多个晚上,我不得不强迫自己停下摆弄它,因为即使我厌倦了一个项目,我也会不可避免地发现还有其他东西可以探索。总而言之,我在盒子里找到了一个特别的组件,这个组件让我马上知道 CrowPi 和我就是天造地设:它是一把不起眼的小螺丝刀。盒子上没有撕开就不保修的标签。CrowPi 希望你去修补、拆解、探索和学习。它不是笔记本电脑,甚至也不仅仅是个树莓派;而是一个便携的、低功耗的、多样化的、开源的学习者工具包。


via: https://opensource.com/article/21/9/raspberry-pi-crowpi2

作者:Seth Kenlon 选题:lujun9972 译者:XiaotingHuang22 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

用树莓派取代食品售货机上的投币箱是一个天才之举。

作为在公共图书馆工作的教育工作者,我一直在关注 树莓派 的有趣用途。在我看来,得克萨斯州达拉斯市的 问答售货机 Trivia Vending Machine 项目是这些神奇设备最具创意和最有趣的用途之一。使用树莓派取代食品售货机上的投币箱是 Greg Needel 和他的团队的一个天才之作。这个想法的潜在用途是深远的。请观看下面这个 YouTube 短视频,了解问答自动售货机的运行情况。

最初的问答售货机专注于科学问题,但你可以制作一个问答售货机来回答任何问题:历史、公民、文学等等。如果你鼓励学生写自己的问题,并回答对方的问题,那将是最有吸引力的用途。请考虑这样:自动售货机可以不发放食物,而是发放当地企业的优惠券。我谋生的方式之一是教吉他课,我很乐意捐出一节吉他课作为问答售货机的优惠券。然而,学生必须积累适当数量的积分才能获得我的一堂吉他课。

把你的想象力再延伸一点。是否有可能让学生解决逻辑谜题,以便从自动售货机获得食物(或优惠券)?是的,这并不难创造。也许是数独谜题、Wordle、KenKen、Sokoban 或任何其他谜题。学生可以用触摸屏玩这些谜题。国际象棋怎么样?当然,学生可以通过解决象棋谜题来获得食物(或优惠券)。

你是否注意到视频中原来的问答售货机又大又重? 设计一个更小的,可能是滚动手推车大小的三分之一,这可以在学校、图书馆、博物馆和创客嘉年华之间更容易运输。

问答售货机的内部由步进电机组成。你可以在网上购买二手的。在网络上搜索“二手自动售货机电机”会出现 Vending WorldVendMedic 网站。

如果你是创客空间的成员,请向其他成员介绍问答售货机。这是一个开放的发明,没有专利,所以任何人都可以制造它。(谢谢你,Greg Needel)我想为这样的设备编写代码并不太难。如果有人可以创建此类代码的 GitHub 仓库,以及可能附带的一些解释性截屏,那就太好了。

虽然问答售货机没有在红牛创意大赛中获奖,但这项发明还是值得获奖的。应该有人找到 Greg Needel 并给他一个合适的奖品。该奖项应该是什么样子的?可能是 2.5 万或 5 万美金的样子。我为 Greg Needel 和他的创意团队欢呼三声。他们把树莓派带到了这种计算机的发明者所希望的方向:修理工的快乐。大胆、美丽、开放。你还能要求更多吗?

最后一件事。问答售货机是几年前使用早期的树莓派型号制作的。当前的树莓派速度更快,响应更快。因此,你在上述视频中注意到的任何交互延迟在今天的树莓派上已不复存在。

哦,我非常想要一块糖果。我砸吧砸吧嘴。提醒我,我需要赚取多少积分才能获得士力架?不惜一切代价,我会不惜一切代价。


via: https://opensource.com/article/23/3/raspberry-pi-trivia-vending-machine

作者:Phil Shapiro 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

数据库管理员(DBA)的职责是什么?

在依赖 Postgres 作为主要数据库管理系统的现代 IT 组织中,Postgres DevOps DBA 发挥着关键作用。Postgres DevOps DBA 的角色涉及许多职责、技能和任务。其中一些包括:管理数据库设计和架构、基础设施管理、确保高可用性、安全性以及执行日常维护任务(调整、备份和恢复以及监控)。

本文总结了当今企业环境中 Postgres DevOps DBA 的常见职责和技能。

数据库设计和架构

Postgres DevOps DBA 的两个主要职责是数据库设计和架构。该角色必须对应用的数据存储要求和涉及的业务逻辑有更深入的了解。这些知识包括设计和创建数据库模式和表。它还意味着配置索引和其他数据库对象以优化查询性能,并选择使用正确的 Postgres 版本。该角色必须确保数据库的设计具有可扩展性和可维护性,同时考虑到未来的增长和数据保留需求。

性能调优

另一个关键的职责是性能调优。Postgres DevOps DBA 必须能够通过监控数据库性能指标和分析查询性能来识别和解决性能问题。该角色还必须对数据库有深入的了解,并能够对其进行配置以获得最佳性能,包括优化查询和索引、调整内存设置以及识别和解决性能瓶颈。

备份与恢复

备份和恢复也是职责的关键。DBA 必须对备份和恢复解决方案有深入的了解,并且必须设计和实施备份策略,以确保在数据丢失的情况下始终可以恢复数据。他们还必须验证恢复过程并实施高可用性和灾难恢复解决方案,以最大限度地减少停机时间和数据丢失。

安全

安全是另一个重要的职责。DBA 通过实施访问控制、加密和其他安全措施来保护数据,从而确保数据库安全。他们还必须了解最新的安全趋势和最佳实践,并加以实施以防范潜在威胁。

基础设施管理

基础设施管理也是一项重要职责。这些 DBA 必须管理硬件、网络和存储基础设施,并提供基础设施以支持 Postgres。他们还必须针对性能和可用性配置基础架构,并根据需要扩展基础架构以适应数据增长。

自动化和脚本

该角色必须能够使用 Ansible、Terraform 和 Kubernetes 等工具自动执行重复性任务,例如备份、监控和修补。他们还必须熟悉自动化最佳实践,以确保高效且有效地自动化任务。自动化减少了人为错误的可能性,提高了效率,并允许 DBA 专注于更复杂的任务。

监控和配置警报

监控数据库和基础设施并设置警报以通知他们问题非常重要。该角色还必须采取主动措施来防止停机和数据丢失,使用 Nagios、Zabbix 和 Prometheus 等监控工具来检测潜在问题。

合作

除了这些技术职责外,PostgreSQL DevOps DBA 还必须与其他 IT 团队(例如开发人员、运维人员和安全人员)协作,以将数据库集成到更大的 IT 生态系统中。DBA 还必须记录他们的工作,并及时了解 Postgres 和 DevOps 的最新趋势和最佳实践。这涉及与利益相关者合作以收集需求、确定优先级并使数据库与组织的更广泛目标保持一致。

总结

总之,Postgres DevOps DBA 在依赖 Postgres 作为主要数据库管理系统的现代 IT 组织中发挥着关键作用。你当前的技能和期望如何匹配此列表?作为现代数据库环境中的 DBA,你是否走在正确的道路上?


via: https://opensource.com/article/23/3/postgres-devops-dba

作者:Doug Ortiz 选题:lkxed 译者:geekpi 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出

我用 gphoto2 给我的旧单反相机带来了新的生命,把它变成了 Linux 电脑的网络摄像头。

今年,在我基本上放弃了 MacBook,转而使用 NixOS 机器之后,我开始在与人进行视频通话时被要求“打开摄像头”。这是一个问题,因为我没有网络摄像头。我考虑购买一个,但后来我意识到我有一台完好无损的 2008 年产的佳能 EOS Rebel XS 数码单反相机放在书架上。这台相机有一个 mini-USB 接口,所以我自然而然地思考:一台数码单反相机、一个 mini-USB 接口和一台台式电脑,是否意味着我能拥有一个网络摄像头?

只有一个问题。我的佳能 EOS Rebel XS 不能录制视频。它可以拍摄一些漂亮的照片,仅此而已。所以这结束了?

还是有别的办法?

恰好有一个叫做 gphoto2 的神奇的开源软件。一旦安装,它允许你从计算机控制各种支持的相机,并拍摄照片和视频。

支持的相机

首先,了解你的设备是否得到支持:

$ gphoto2 --list-cameras

拍摄图像

你可以用它拍照:

$ gphoto2 --capture-image-and-download

快门触发,图像会保存到你当前的工作目录中。

录制视频

我意识到了这里的潜力,所以尽管我的相机没有视频功能,我还是决定尝试 gphoto2 --capture-movie 命令。不知怎么,尽管我的相机不支持视频功能,gphoto2 仍然能够生成一个 MJPEG 文件!

在我的相机上,我需要将其置于“实时预览”模式下,然后 gphoto2 才能录制视频。这包括将相机设置为纵向模式,然后按下 “ 设置 Set ” 按钮,使取景器关闭,相机屏幕显示图像。不幸的是,这还不足以将其用作网络摄像头。它仍然需要分配一个视频设备,例如 /dev/video0

安装 ffmpeg 和 v4l2loopback

毫不奇怪,有一个开源的解决方案来解决这个问题。首先,使用你的包管理器安装 gphoto2ffmpegmpv。例如,在 Fedora 、CentOS 、Mageia 和类似的 Linux 发行版上:

$ sudo dnf install gphoto2 ffmpeg mpv

在 Debian、Linux Mint 及其类似发行版:

$ sudo apt install gphoto2 ffmpeg mpv

我使用的是 NixOS,这是我的配置文件:

# configuration.nix
...
environment.systemPackages = with pkgs; [
  ffmpeg
  gphoto2
  mpv
...  
]

创建虚拟视频设备需要使用 v4l2loopback Linux 内核模块。在撰写本文时,该功能未包含在主线内核中,因此你需要自己下载和编译它:

$ git clone https://github.com/umlaeute/v4l2loopback
$ cd v4l2loopback
$ make
$ sudo make install
$ sudo depmod -a

如果你像我一样使用 NixOS ,你可以在 configuration.nix 中添加额外的模块包:

[...]
boot.extraModulePackages = with config.boot.kernelPackages;
[ v4l2loopback.out ];
boot.kernelModules = [
  "v4l2loopback"
];
boot.extraModprobeConfig = ''
  options v4l2loopback exclusive_caps=1 card_label="Virtual Camera"
'';
[...]

在 NixOS 上, 运行 sudo nixos-rebuild switch,然后重启。

创建一个视频设备

假设你的计算机当前没有 /dev/video 设备,你可以借助 v4l2loopback 在需要时创建一个。

运行以下命令,将 gphoto2 中的数据发送到 ffmpeg,使用设备如 /dev/video0 设备:

$ gphoto2 --stdout --capture-movie |
 ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video0

你得到的输出是这样的:

ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11.3.0 (GCC)
  configuration: --disable-static ...
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Capturing preview frames as movie to 'stdout'. Press Ctrl-C to abort.[mjpeg @ 0x1dd0380] Format mjpeg detected only with low score of 25, misdetection possible!
Input #0, mjpeg, from 'pipe:':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 768x512 ...
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native))[swscaler @ 0x1e27340] deprecated pixel format used, make sure you did set range correctly
Output #0, video4linux2,v4l2, to '/dev/video0':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: rawvideo (I420 / 0x30323449) ...
    Metadata:
      encoder         : Lavc58.134.100 rawvideoframe=  289 fps= 23 q=-0.0 size=N/A time=00:00:11.56 bitrate=N/A speed=0.907x

要查看来自网络摄像头的视频,请使用 mpv 命令:

$ mpv av://v4l2:/dev/video0 --profile=low-latency --untimed

Streaming a live feed from the webcam

自动启动你的网络摄像头

每次想使用网络摄像头时都需要执行一次命令有点麻烦。幸运的是,你可以在启动时自动运行此命令。我将其实现为一个 systemd 服务:

# configuration.nix
...
  systemd.services.webcam = {
    enable = true;
    script = ''
      ${pkgs.gphoto2}/bin/gphoto2 --stdout --capture-movie |
        ${pkgs.ffmpeg}/bin/ffmpeg -i - \
            -vcodec rawvideo -pix_fmt yuv420p -f v4l2  /dev/video0
    '';
wantedBy = [ "multi-user.target" ];
  };
...

在 NixOS 上,运行 sudo nixos-rebuild switch,然后重新启动你的计算机。你的网络摄像头已经开启并处于活动状态。

要检查是否存在任何问题,可以使用 systemctl status webcam 命令。它会告诉你服务最后一次运行的时间,并提供其以前输出的日志。这对于调试非常有用。

迭代以使其变得更好

止步于此也许很诱人。但是,考虑到当前的全球危机,我们可能需要思考是否有必要一直开着网络摄像头。这让我感到不太理想,原因如下:

  • 这浪费电。
  • 这类事情涉及隐私问题。

我的摄像头有一个镜头盖,所以说实话,第二个原因并不真的让我感到困扰。当我不使用网络摄像头时,我总是可以把镜头盖上。然而,让一个耗电量大的单反相机整天开着(更不用说需要解码视频所需的 CPU 开销),对我的电费并没有任何好处。

理想情况是:

  • 我一直把相机插在电脑上,但是关闭的。
  • 当我想使用网络摄像头时,我按下相机的电源按钮将其打开。
  • 我的计算机会检测到相机并启动 systemd 服务。
  • 使用网络摄像头完成后,我再次将其关闭。

为了实现这一点,你需要使用一个自定义的 udev 规则。

udev 规则可以告诉你的计算机,当它发现某个设备已经可用时执行某个任务。这可以是外部硬盘甚至是非 USB 设备。在这种情况下,你需要通过其 USB 连接识别相机。

首先,指定 udev 规则被触发时要运行的命令。你可以用一个 shell 脚本来完成(systemctl restart webcam 应该可以工作)。我运行的是 NixOS,所以我只需要创建一个派生包(一个 Nix 包),它会重新启动 systemd 服务:

# start-webcam.nix
with import <nixpkgs> { };
writeShellScriptBin "start-webcam" ''
  systemctl restart webcam
  # debugging example
  # echo "hello" &> /home/tom/myfile.txt
  # If myfile.txt gets created then we know the udev rule has triggered properly''

接下来,实际定义 udev 规则。查找摄像头的设备和厂商 ID。使用 lsusb 命令可以完成此操作。该命令可能已经安装在你的发行版上,但我不经常使用它,因此我只需要根据需要使用 nix-shell 安装它:

$ nix-shell -p usbutils

无论你的计算机上已经安装了它,还是刚刚安装,请运行 lsusb

$ lsusb
Bus 002 Device 008: ID 04a9:317b Canon, Inc. Canon Digital Camera[...]

在此输出中,厂商 ID 为 04a9,设备 ID 为 317b。这已足以创建 udev 规则:

ACTION=="add", SUBSYSTEM=="usb",
ATTR{idVendor}=="04a9",
ATTR{idProduct}=="317b",
RUN+="/usr/local/bin/start-webcam.sh"

或者,如果你使用的是 NixOS:

# configuration.nix[...]let
  startWebcam = import ./start-webcam.nix;[...]
services.udev.extraRules = ''
  ACTION=="add",  \
  SUBSYSTEM=="usb", \
  ATTR{idVendor}=="04a9", \
  ATTR{idProduct}=="317b",  \
  RUN+="${startWebcam}/bin/start-webcam"'';[...]

最后,在你的 start-webcam systemd 服务中删除 wantedBy = ["multi-user.target"]; 这一行。(如果保留它,则无论相机是否开启,该服务都会在下次重启时自动启动。)

重复使用旧技术

我希望这篇文章能让你在放弃一些旧技术之前三思而后行。Linux 可以为技术注入活力,无论是你的电脑还是数码相机或其他外围设备等简单的东西。


via: https://opensource.com/article/22/12/old-camera-webcam-linux

作者:Tom Oliver 选题:lkxed 译者:Pabloxllwe 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出