FFmpeg是一款著名的开源音视频处理软件,它可以完成记录、转换数字音频、视频,并能将其转化为流等功能。

  我们可以运用其强大的滤镜功能来完成一些对视频、音频的处理。而对于视频而言,如果只截取视频中的一帧图像,那么就可以完成对视频的截图。命令中可以使用-vframes代替-frames:v

ffmpeg -ss HH:MM:SS -i input -frames:v 1 output

  但事实上,FFmpeg并不能截取对应时间准确的一帧。因为对于某些格式的视频而言,使用FFmpeg-ss参数只能只能截取到欲截取帧前的关键帧。

  如果想生成一个简单的缩略图,则需要使用一定数量的图片然后拼接起来。这里以3*3的截图为例,那么我们所需要获取到的就是九张截图。如果想要等时间间隔的生成九张图片,那么我们首先要获取到的便是视频的时长。

ffprobe -i input -show_entries format=duration -v quiet -of csv="p=0"
  • Python实现:
import subprocess

def get_length(video_name: str) -> str:
        cmd = 'ffprobe -i {} -show_entries format=duration -v quiet -of csv="p=0"'.format(video_name)
        result = subprocess.Popen(cmd,
                                  stdout=subprocess.PIPE,
                                  stderr=subprocess.STDOUT)

        output, error = result.communicate()
        output = output.splitlines()[0]
        length = output.decode()
        return length

  通过以上命令我们可以获得,以秒为单位的视频时长。所以我们可以把视频时长分成十份,然后用这九个间隔所在的点作为截图点。

def get_point(length: str) -> list:
        length = int(float(length))
        interval = length / (10)
        time_list = []
        # 生成截图时间点
        for i in range(9):
            time_list.append(interval * (i + 1))
        return time_list

  既然截图的时间点已经得到,那么我们就可以利用这些时间点来进行截图了。不过如果仅仅是将截图简单地获取并输出,那么我们就无法区分各个截图之间的区别。所以我们可以通过FFmpeg的滤镜,在输出截图的同时将截图在视频中的时间点一并输出在截图上。

ffmpeg -start_at_zero -copyts -ss HH:MM:SS -i input \
    -vf "drawtext=fontfile=./Arial.ttf:fontsize=20:fontcolor=yellow:x=5:y=5:text='Time\\: %{{pts\\:hms}}'" \
    -vframes 1 output

  在这段代码中,使用到的-start_at_zero-copyts两个参数一般使用在视频截取中,保留原有的时间轴。-vf-filter:v,drawtext是视频滤镜的一种,用法可以查看这里。这里用以在图片左上角生成对应帧的时间戳。

import subprocess
import datetime
import shlex

def get_screenshot(video_name: str, time_list: list) -> list:
    # 注意请将对应的字体文件放置于视频目录,避免出错。此处使用的是Arial字体。
    ffmpeg_sh = '''ffmpeg -start_at_zero -copyts -ss {timestamp} -i {input} \
    -vf "drawtext=fontfile=./Arial.ttf:fontsize=20:fontcolor=yellow:x=5:y=5:text='Time\\: %{{pts\\:hms}}'" \
    -vframes 1 "{output}"'''
    thumb_list = []
    for i in time_list:
        time = str(datetime.timedelta(seconds=i))
        # 按现在时间生成截图名
        time_now = str(datetime.datetime.now().strftime("%Y%m%d_%H%M%S.%f"))  
        output_name = video_name + "_" + time_now
        cmd = ffmpeg_sh.format(timestamp=time, input=video_name, output=output_name)
        cmd = shlex.split(cmd)
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        
        thumb_list.append(output_name)
        while True:
            if p.poll() is not None:
                break
    
    return thumb_list

  通过以上代码我们就获取到了九张截图,以及九张截图的名字,接下来我们要做的就是将这九张截图组合成一张3*3的截图。

简介

  为 qBittorrent WebUI 设置 Let's Encrypt 的 HTTPS 证书和简单。而通过这种方法添加的证书,相比于自签证书,因为所有的现代浏览器都会默认信任 Let's Encrypt 的证书,所以在访问网页的时候,你不会得到警告也无需因此添加安全例外。
  在阅读此教程之前,我们假定你已经安装好了qBittorrent-nox,同时

  • 你知道如何并且会在你的路由上转发端口
  • 你已经设置好 DNS 指向你运行 WebUI 的 ip。

安装 certbot

  certbot 是 ACME 推荐的用于申请和管理 Let's Encrypt 证书的客户端。虽然你可以从 Ubuntu 官方的 repositories 安装它,但从 PPA 安装的则是最新的稳定版,所以我们安装这个。

sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot

获得证书

  在此过程中,你需要确保 80 或是 443 端口不被占用。如果你的主机上还有其他的软件占用了 443 端口,就使用 80 端口,反之亦然。在此例中我们将使用 80 端口来进行证书签发。如果你想使用 443 端口,除了端口号要改变,你还需要在以下命令中将 --preferred-challenges 的参数从 http 替换为 tls-sni 。关于这点可以查看 certbot 的相关文档获取更多信息。
  这里我们将用 standalone 的方法来获取证书。在此之前你还需要:

  • 暂时将占用 80 端口的程序或服务停止。
  • 在你的路由器里转发 80 端口。
  • 如果你还没有打开在防火墙(很有可能是 ufw )中打开 80 端口,请把它打开。

现在运行以下命令来获得你的证书(注意用你的实际域名替换yourwebuidomain):

sudo ufw allow 80
sudo ufw reload
sudo certbot certonly --standalone --preferred-challenges http --must-staple --redirect --hsts --uir --staple-ocsp --rsa-key-size 4096 --domain yourwebuidomain

  当证书生成成功后你就可以重启你的监听 80 端口的任何程序或者是重新屏蔽 80 端口(sudo ufw deny 80 && sudo ufw reload)。
注意:下面的在上面使用过的六个选项是可选的,但是有利于更强的安全:

  • --rsa-key-size 4096
  • --must-staple
  • --redirect
  • --hsts
  • --uir
  • --staple-ocsp
    查阅文档获取更多信息。

在 Web UI 上安装证书

  1. 打开你的 Web UI。
  2. 在 Tools -> Options... 菜单中,进入 Web UI 标签。
  3. 在 “Sever domain:” 空格中填入你的域名。
  4. 勾选 “Use HTTPS instead of HTTP”。
    • 如果你使用的是 4.2.0 或者更新的版本:

      • 在 ”Key:“ 文本框中粘贴上密钥文件路径。
      • 在 ”Certificate:“ 文本框中粘贴上证书文件路径。
      • 注意事项:因为往往这些文件所处的位置,例如,路径 /etc/letsencrypt/live/yourwebuidomain/,对root 而言是只读的。这就意味着,你也许需要先将这些文件(即密钥和证书)复制到某些目录,某些你运行 qBittorrent 所在的用户账号可读的目录。请不要修改 cerbot 原始目录的权限。
    • 如果你使用旧一些的版本:

      • 在 ”Key:“ 文本框中粘贴上密钥文件的内容。密钥可能存储在 /etc/letsencrypt/live/yourwebuidomain/privkey.pem,你也许需要 root 权限来访问次文件。
      • 在 ”Certificate:“ 文本框中粘贴上证书文件的内容。证书可能存储在 /etc/letsencrypt/live/yourwebuidomain/fullchain.pem,你也许需要 root 权限来访问次文件。
  5. 点击保存,关闭标签然后你现在只能通过 HTTPS 来访问你的 Web UI。

自动续期证书

  你的证书会在 90 天后到期,你可以手动续期他们或是为你的证书设置自动续期。
  对于不经常使用 80 端口的用户,这儿给出一种可能的的命令:

  sudo certbot renew --pre-hook "ufw allow 80 && ufw reload" --post-hook "ufw deny 80 && ufw reload

  如果你有程序在监听 80 端口,确保使用 --pre-hook--post-hook 参数来重启他。例如,--pre-hook "stop_my_program.sh"--post-hook "restart_my_program.sh"

  另外,也可以使用 cerbot 的钩子来复制证书文件或是关闭和重启 qBittorrent ,甚至可以修改其配置。

  每次命令运行时,certbot 都会检查是否有证书已经超过 60 天,并且并更新过期的证书。
  你可以将你续期命令写入 crontab 或是 systemd unit 并设置成 Let's Encrypt 推荐的一天运行一次或两次。

参考

一、Minecraft服务端环境搭建

1.Minecraft服务器需要java支持。所以先检查服务器是否已经安装Java,我们执行下面的命令:

java -version

如果Java已经安装,我们将得到当前Java版本的信息。如果我们没有安装Java,我们将得到错误信息,像“Command not found”或类似的信息。这种情况则需要更新java。

2.把当前的软件源都更新并安装java。

sudo apt-get update && sudo apt-get install default-jdk

3.下载Minecraft服务器所需文件。

mkdir minecraft
cd minecraft
wget -O minecraft_server.jar https://s3.amazonaws.com/Minecraft.Download/versions/1.7.4/minecraft_server.1.7.4.jar
#此处可以将版本号替换下载想要的版本

4.下载完成后即可运行Minecraft服务端,命令如下:

java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui
#1024M为运行内存大小,请谨慎设置。
#且执行此命令要在minecraft目录下执行或将位置更改为绝对路径。

至此Minecraft服务端已搭建完成。如果是在远程服务器上搭建当连接断开后,Minecraft也会停止运行,所以需要让其在后台正常运行。

二、Minecraft服务端后台运行

1.nohup方式后台运行。

a.后台运行指令。

nohup java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui &

b.查看是否正常运行。

ps -aux|grep java

若成功运行则有类似以下的结果。

root 18896 9.0 61.5 3030584 625424 ? Sl 11:44 13:12 java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui

c.如何关闭后台。
首先运用以下代码找到minecraft的进程号。阿里云存在云盾所以运行以下命令后可能不止一个pid出现。

ps -aux|grep java| grep -v grep | awk '{print $2}'

然后执行以下命令即可关闭进程。

kill -9 进程号

2.screen方式后台运行。

a.检查screen是否安装。

screen

如果提示command not found,则执行以下命令:

sudo apt-get -y install screen

b.创建一个名为Minecraft的session。

screen -S "Minecraft"

c.在当前screen下运行Minecraft服务端。

java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui

d.经过以上步骤即使断开与服务器连接,Minecraft服务端依旧在后台运行,再次连接服务器时使用以下命令调用screen。

screen –r Minecraft

三、Minecraft服务端配置

1.经过以上步骤在客户端还不能正常访问服务端,因为服务端会有正版验证需要通过修改服务端配置文件来关闭。

vim ~/minecraft/server.properties
#Minecraft server properties
#Fri Aug 10 06:27:09 UTC 2018
generator-settings=
op-permission-level=4
allow-nether=true#是否开启地狱
level-name=world#默认世界名称(最好不要改)
enable-query=false
allow-flight=false
announce-player-achievements=true
server-port=25565#服务器端口
level-type=DEFAULT
enable-rcon=false#是否开启rcon监听
force-gamemode=false#force游戏模式
level-seed=#我的世界地图种子
server-ip=#服务器指向IP(默认不要改放空)
max-build-height=256#服务器最大建筑高度
spawn-npcs=true#是否有主城NPC
white-list=false #是否开启白名单(开启后在白名单内的玩家才能进入服务器,否则进入不了。不要随便开)
spawn-animals=true#主城是否有动物
snooper-enabled=true
hardcore=false#我的世界极限模式是否开启
online-mode=false#是否开启正版验证,需用我的世界官方启动器才能进入
resource-pack= #服务器资源包:填下载地址(不需要就不填)
pvp=true #是否开启服务器PVP
difficulty=1#服务器难度: 0和平 1简单 2中等 3困难
enable-command-block=false#是否开启命令方块
player-idle-timeout=0
gamemode=0#玩家默认进入游戏的游戏模式 1创造 0生存 2冒险模式3旁观者
max-players=20#服务器最大玩家数(超过后玩家无法进入)
spawn-monsters=true#主城是否刷新怪物
view-distance=10 
generate-structures=true
spawn-protection=16 #服务器最大保护区(玩家破坏建筑不了)
motd=A Minecraft Server#MOTD指的是在玩家添加服务器后下面会显示这里面的内容(不能为中文、特殊符号)

将其中的online-mode=true更改为online-mode=false即可。注意请勿复制以上内容,第一次运行游戏后此内容将在目录下生成,且此注释仅供参考,请勿添加在配置文件中,否则可能使游戏无法启动。

至此Ubuntu下的我的世界服务器已搭建完成。

参考文章:
1.Ubuntu下搭建我的世界服务器 https://blog.csdn.net/CSDNzyq/article/details/52735097
2.nohup和&后台运行,进程查看及终止
https://www.cnblogs.com/baby123/p/6477429.html
3.我的世界服务器server.properties配置教程https://jingyan.baidu.com/article/8ebacdf074bc0049f75cd550.html
4.screen 常用命令https://jingyan.baidu.com/article/25648fc184e9ab9190fd005c.html
5.linux 技巧:使用 screen 管理你的远程会话https://www.ibm.com/developerworks/cn/linux/l-cn-screen/