乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

关于执行git log出现中文无法完全显示的问题

发表于 2024-06-08

前言

在终端中执行git log指令时, 出现中文无法完全的显示的问题, 如下:

image-20240608122457671

这个问题通常是因为Git的日志输出包含了非ASCII字符,而终端或者控制台的字符编码设置不正确导致的

解决方案

只需将终端或控制台的字符编码设置为UTF-8

  • 对于Windows系统,可以在终端窗口中通过右键点击标题栏 -> 属性 -> 字体 -> 高级,然后设置字符编码为UTF-8

  • 对于Linux或Mac系统,可以在终端设置中查找相关选项,或者直接在终端中输入以下命令来设置字符编码:

    1
    2
    export LC_ALL=en_US.UTF-8
    export LANG=en_US.UTF-8

最后效果如下:

image-20240608123254970

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

探索rembg开源库,三行代码轻松去除图片背景

发表于 2024-05-20

前言

python开源库rembg,让你轻松实现去除图片背景的效果。

效果展示

原图 去除背景之后
animal-1.jpg animal-1.out.png

核心代码

1
2
3
input = Image.open(input_path)  # 打开原图
output = remove(input) # 去除背景
output.save(output_path) # 保存图片

环境准备

需要 python 版本 >3.7, <3.12 安装依赖,同时支持源码调用和命令行调用,使用时按需求安装

CPU 版本

1
2
pip install rembg # 编码使用
pip install rembg[cli] # 编码+命令行

GPU版本

1
2
pip install rembg[gpu] # 编码使用
pip install rembg[gpu,cli] # 编码+命令行

第一次运行会先下载预训练的模型,下面有模型的下载地址

命令行模式

去除背景

1
rembg i path/to/input.png path/to/output.png

用指定模型

1
rembg i -m u2netp path/to/input.png path/to/output.png

只保留蒙版效果

1
rembg i -om path/to/input.png path/to/output.png

只保留蒙版效果

image-20240521142110354

批量处理

1
rembg p path/to/input path/to/output

服务器模式

会启用一个服务,然后前端可以通过接口访问,默认的接口地址 http://localhost:5000/api

1
rembg s

运行效果

UI效果 API地址

代码调用

一般调用

1
2
3
4
5
6
7
8
9
10
from rembg import remove

input_path = 'input.png'
output_path = 'output.png'

with open(input_path, 'rb') as i:
with open(output_path, 'wb') as o:
input = i.read()
output = remove(input)
o.write(output)

使用 PIL 打开图片

1
2
3
4
5
6
7
8
9
from rembg import remove
from PIL import Image

input_path = 'input.png'
output_path = 'output.png'

input = Image.open(input_path)
output = remove(input)
output.save(output_path)

使用 opencv 打开图片

1
2
3
4
5
6
7
8
9
from rembg import remove
import cv2

input_path = 'input.png'
output_path = 'output.png'

input = cv2.imread(input_path)
output = remove(input)
cv2.imwrite(output_path, output)

使用指定的模型

1
2
3
4
5
6
from rembg import new_session, remove

image = Image.open('./examples/car-1.jpg')
model = 'u2net_human_seg' # 指定模型类型
output = remove(image, session=new_session(model))
output.save('./output/car-3.png')

分割保留人物效果,模型 u2net_human_seg

原图 去除背景并分割人物

其他高级模式请自行探索 源码地址 rembg

预训练模型

第一次运行会先下载预训练的模型,默认从 github 下载,在国内可能无法从 github 下载,这里提供一个 网盘的下载地址 模型-国内网盘下载,下载之后放在 C:\Users\用户名\.u2net\ 目录下

这些不需要全部下载,可以只下载其中一个,默认需要的模型是 u2net,其他的模型根据需求有选择的下载

可以使用的模型有

  • u2net (download, source): 通用预训练模型
  • u2netp (download, source): u2net的轻量版
  • u2net_human_seg (download, source): 预训练的人物分割模型
  • u2net_cloth_seg (download, source): 预训练的衣服的分割模型,会分割 上半身,下半身和全身
  • silueta (download, source): 和 u2net 模型一样只不过大小只有 43MB
  • isnet-general-use (download, source): 预训练的通用模型
  • isnet-anime (download, source): 动漫角色的高精度分割模型
  • sam (download encoder, download decoder, source): 预训练的通用模型

本文转载自: 掘金

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

如何将静态网页打包下载到本地

发表于 2024-04-28

前言

关于如何将静态网页中的html、图片、样式表和JavaScript文件下载到本地

有以下几种方案

使用wget

假设你要下载的静态网站链接为https://baidu.com,可以使用以下命令来下载:

1
wget --recursive --no-clobber --page-requisites --html-extension --convert-links http://example.com

参数解释:

  • --recursive:递归下载,将链接的页面上的链接一并下载
  • --no-clobber:不重复下载已下载过的文件
  • --page-requisites:下载页面的所有资源,包括图片、样式表和 JavaScript 文件
  • --html-extension:将所有的页面文件的后缀名设置为.html
  • --convert-links:将页面引用的链接转换为本地路径
    执行这个命令后,wget 会将整个网站下载到当前目录下的一个名为 example.com 的文件夹中

使用wget下载的方式可以将整站的静态网页和相对路径资源打包下载到本地 有点类似于整站克隆

以登录状态进行下载

有些网站的页面需要进行登录后才能正常显示 如果我们要实现保持登录状态进行页面的下载 那么就需要使用cookies

首先 我们需要登录获取cookies 然后保存在本地文本中:

1
wget --save-cookies=cookies.txt --keep-session-cookies --post-data 'username=your_username&password=your_password&other_field=value' https://yourwebsite.com/login

这里的表单信息需要替换成目标网站的值

cookies.txt内容格式如下:

1
2
3
4
5
6
7
8
9
# HTTP Cookie File
# Generated by Wget on 2024-05-06 14:37:15.
# Edit at your own risk.



域名 路径 安全 有效期 接收时间 发送时间 协议 名称 值

www.example.com / FALSE 0 Mon, 01-Jan-1970 00:00:00 GMT Mon, 01-Jan-1970 00:00:00 GMT HTTP myCookie myValue

有了cookies后 接下来使用--load-cookies进行下载

1
wget --load-cookies=cookies.txt --keep-session-cookies --recursive --no-clobber --page-requisites --html-extension --convert-links https://example.com

假如用户登录并不是以表单的形式 可能是第三方登录 或者PHP网站 那么我们可以借助python中的selenium来模拟浏览器登录获取cookies

python3代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# -*- coding:utf-8 -*-
####################################
#
# 获取网站cookies并保存到本地txt文档中
#
####################################
from selenium import webdriver
import time
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-gpu') #如果不加这个选项,有时定位会出现问题
browser = webdriver.Chrome(options=chrome_options)


def getCookies():
browser.get('https://example.com')
# 延迟20秒,让你有充分的时间去填写你的登录信息
time.sleep(20)
cookies=browser.get_cookies()
print(cookies)
# 创建一个名为cookies的txt文件
with open('cookies.txt', 'w') as f:
# 将cookies保存为json格式
# 将cookies保存为wget可识别的格式
for cookie in cookies:
cookie_str = f"{cookie['name']}={cookie['value']};"
f.write(f"{cookie_str}\n")


getCookies()

或者使用chrome插件获取并导出cookies 该插件名为Get cookies.txt Clean

image-20240506134658233

使用Chrome插件

  • Save All Resources : 该扩展程序可一键下载所有资源文件并保留文件夹结构

    插件安装后 打开开发者界面ResourcesSaver选项卡即可根据自己的需求进行资源下载:

    image-20240428132540012

    注意: 这个插件只能下载当前页面的Html页面和相关资源

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Mac平台下一键启动脚本汇总

发表于 2024-04-28

前言

Mac平台默认启动终端的方式有些繁琐

为了减少大脑压力 简化实现流程 我们可以使用自定义脚本的方式 快速在当前目录下启动某个应用

但是单纯使用sh脚本话 依然有些繁琐 因为免不了需要手动输入执行指令 不过好在Mac中Finder给我们提供的添加自定义菜单的功能:

ssh

我们只需将编写好的.sh脚本文件拖入到窗口菜单面板中 然后默认使用第三方终端打开脚本 那么当我们点击图标的时候 就能快速执行脚本内容了

至于如何将脚本文件拖入到面板中 只需按住command键即可 如果你想移除它 也是同样的操作

下面列出了一些常用的脚本 大家可以依葫芦画瓢 自行发挥

脚本

  1. 一键打开终端,并切换到当前目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash

    # 获取当前打开的目录
    thePath=$(osascript -e 'tell application "Finder" to set thePath to POSIX path of (target of front window as alias)')

    # 去除路径中的引号
    thePath=$(sed "s/\'//g" <<< "$thePath")

    # 尝试打开 Terminal 终端
    open -a Terminal "$thePath" && sleep 2 && osascript -e 'tell application "Terminal" to close (first window whose name contains "terminal.command")'

    # 如果打开失败,则切换到当前目录并启动默认终端
    cd "$thePath"
    bash
  1. 一键打开 vscode,并加载当前目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash

    # 使用AppleScript获取当前打开的目录
    thePath=$(osascript -e 'tell application "Finder" to set thePath to (quoted form of POSIX path of (target of front window as alias))')

    # 去除路径中的引号
    thePath=${thePath//\'/}

    # 输出获取到的目录路径
    echo $thePath

    # 启动 vs,并加载所在目录
    open -a "Visual Studio Code" "$thePath"
  2. 一键登录服务器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #! /usr/bin/expect
    # 依赖 expect 命令,https://www.linuxprobe.com/linux-expect-auto.html

    # 启动 ssh 进程
    spawn /usr/bin/ssh root@这里替换ip

    # 匹配标准输出中的字符串
    expect "root@这里替换ip's password"

    # 向标准输入填充密码并换行
    send "这里替换密码\r"

    # 匹配标准输出中的字符串
    expect "to Alibaba Cloud"

    # 脱离控制,将控制权交还给用户,允许用户交互
    interact
  3. 一键启动静态服务器,并加载当前目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash

    # 使用AppleScript获取当前打开的目录
    thePath=$(osascript -e 'tell application "Finder" to set thePath to (quoted form of POSIX path of (target of front window as alias))')

    # 去除路径中的引号
    thePath=${thePath//\'/}

    # 随机端口
    random=$((RANDOM%10000+20000))

    # 打印运行的路径
    echo "http://127.0.0.1:$random"
    echo $thePath

    # 使用 anywhere 打开当前目录的 server
    python3 -mhttp.server $random -d "$thePath"
  4. 创建指定的目录结构

    比如这种:

    1
    2
    3
    4
    5
    new_directory
    ├── outputs
    ├── sounds
    ├── subtitles
    └── videos

    实现指令如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash

    # 获取当前打开的目录
    thePath=$(osascript -e 'tell application "Finder" to set thePath to POSIX path of (target of front window as alias)')

    # 去除路径中的引号
    thePath=$(sed "s/\'//g" <<< "$thePath")

    # 创建一个新的目录
    mkdir -p "$thePath/new_directory"

    # 在新目录下创建多个子目录
    mkdir -p "$thePath/new_directory"/{sounds,videos,subtitles,outputs}

关于应用图标的更换

如果我们想给脚本添加上对应的图标 比如将启动vscode的脚本换成vscode应用的图标 那么我们可以:

  1. 选中vscode应用右键拷贝 (不是复制)
  2. 选中脚本文件 右键打开显示简介
  3. 在显示简介窗口中 点击图标栏 然后command+v粘贴即可

相关问题

  1. 如果你想使用Mac自带的终端启动该脚本 只需将后缀.sh改成.command即可

  2. 如果出现权限问题 需要手动修改权限

    image-20240501180139497

    执行以下命令修改脚本访问权限:

    1
    chmod 777 xxx.command
  3. 当应用启动后 终端窗口未关闭

    image-20240501191108941

    这种情况 我们需要去终端偏好设置中进行相关设置 将关闭是否询问改为永不 当shell退出窗口时关闭终端:

    image-20240501191204817

    image-20240501191825595

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Git不小心添加了大文件 如何移除减少git包的体积

发表于 2024-04-23

问题

最新有个项目在git提交时忘了在.gitignore添加忽略了 导致不小心提交了一个大文件进去

当得知这一操作后 立马使用git reset Head^对提交进行回退 并且使用git rm --cache来删除这个大文件缓存 可问题是.git包体积依然很大 说明这个文件还未彻底清除

如果想清除该大文件 可以按照以下操作

解决步骤

  1. 使用git filter-branch命令:

    1
    git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path/to/your/large/file' --prune-empty --tag-name-filter cat -- --all

    请将path/to/your/large/file替换为实际文件的路径 这个命令会重新写入所有的历史记录,将指定的大文件从中移除

  2. 清除reflog记录:

    1
    git reflog expire --expire=now --all

    上面的指令会清除所有的reflog记录, 如果我们只想清除误添加大文件的那个记录可以使用以下指令:

    1
    git reflog delete HEAD@{n}
  3. 垃圾回收:

    1
    git gc --prune=now

    这个命令将清除不再需要的对象,并压缩.git文件

  4. 使用bfg工具(如果需要)
    如果上述方法无效,你可以尝试使用bfg工具。首先,安装bfg:

    1
    brew install bfg # 如果你使用的是Mac,并且安装了Homebrew

    然后,在你的项目目录下运行以下命令来移除大文件:

    1
    bfg --delete-files path/to/your/large/file

    最后,执行垃圾回收命令来清除无用的数据:

    1
    git reflog expire --expire=now --all && git gc --prune=now --aggressive

    bfg工具比filter-branch更快,并且更容易使用。

在执行这些操作之前,请确保你已经备份了重要的数据,以防万一

另辟蹊径

当我们将commit进行回退然后提交到远程仓库后, 其实远程仓库的git包是不带大文件的 也仅仅是本地.git还存在缓存垃圾

根据此原理 我们可以重新clone一下项目代码到独立的目录中 让后将.git进行替换即可

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于hexo博客生成文章时报错

发表于 2024-04-23

问题

执行hexo g指令时报错:

1
Nunjucks Error: [Line 22, Column 66] expected variable end

或者

1
Error: expected end of comment, got end of file

这种情况一般是在文章中添加了导致的 或者下面各种符号:

1
{#

我这边 也只能使用代码块包裹 不然文章转换报错😂

解决办法

只需要在外面加上反引号`来告诉hexo不要解析其中内容, 如下:

1
2
`{{`
`}}`

或者使用代码块进行包裹 比如:

1
2
3
4
<template>
<div>content is {{ content }}</div>
<div>title is {{ title }}</div>
</template>

一般来说被引用或者被包裹后基本就不会有啥问题了 带#号的使用反引号无效 只能使用代码块包裹

如果上面的方法 还是解决不了就只能使用下面这种方法了:

在出现问题内容前后添加 ` 和 `进行包裹即可解决该问题 比如:

1
2
3
{% raw %}
{{Y=min⁡1≤i≤NYi+1}}
{% endraw %}

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

自建直播推流服务器

发表于 2024-04-23

前言

最近在研究无人直播, 一直使用B站直播平台测试 由于在测试的过程中我需要不断地尝试各种骚操作 经常需要反复中断启动直播 某次偶然间发现有几个小伙伴在看我推的直播

为了给自己留点路人缘 我打算自建一个本地推流服务器 用于测试

Github上有很多现成的项目可以使用, 有网友推荐nginx-rtmp-module和Node-Media-Server

秉着少掉点头发的目的 这里我选择由nodejs开发的 Node-Media-Server

接下来给大家分享我的搭建过程

实现步骤

首先电脑需要先安装nodejs环境 这一步就不在这细说了

  1. 下载安装包

    1
    npm install node-media-server
  2. 创建app.js启动文件

    1
    vi app.js

    并将以下启动代码填入到app.js中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    const NodeMediaServer = require('node-media-server');

    const config = {
    rtmp: {
    port: 1935,
    chunk_size: 60000,
    gop_cache: true,
    ping: 30,
    ping_timeout: 60
    },
    http: {
    port: 8000,
    allow_origin: '*'
    }
    };

    var nms = new NodeMediaServer(config)
    nms.run();
  3. 启动服务器

    1
    node app.js

    此时我们在终端能看到启动日志, 表示推流服务器启动成功:

    image-20240423175954116

  4. 将视频推送到该服务器中

    这里使用FFmpeg工具进行推流, 指令如下:

    1
    ffmpeg -re -i xxx.mp4 -c copy -f flv "rtmp://localhost/live/STREAM_NAME"

    推流地址固定为 : rtmp://localhost/live/STREAM_NAME

    如果终端出现类似于以下日志 表示推送成功:

    image-20240423180246497

  5. 拉流测试效果

    拉流地址和推流地址相同 为 rtmp://localhost/live/STREAM_NAME 我们可以借助能播放直播流的第三方播放器来测试 这里我使用恒星播放器 能正常拉取到视频

    image-20240423180604883

    image-20240423180422500

  6. 实现完毕

是不是很简单呢 有需要的话赶紧试试吧😜

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用Docker安装kplayer实现无人直播

发表于 2024-04-23

前言

之前文章给大家介绍了在ubuntu服务器上安装并使用kplayer, 详情参见《使用kplayer实现无人直播》

今天给大家介绍kplayer的docker安装与使用, 其实大同小异 如果你平常用惯了docker 那么使用容器部署的方式会更加简单

无人直播前置需求

  • 云服务器一台 或者24开机联网运行的本地电脑
  • ffmpeg
  • 推流地址 (B站、抖音、斗鱼…)
  • 准备好不涉及侵权的视频内容

实现步骤

这边使用docker容器快速安装使用

  1. 搜索ant-media-server镜像

    1
    docker search kplayer
  2. 拉取ant-media-server镜像

    1
    docker pull bytelang/kplayer:latest
  3. 创建配置文件用于映射

    配置文件存放目录自定义 这里我放在/root/config/目录下 创建一个名为config.json的文件

    1
    touch config.json
  4. 定义推流配置信息

    在config.json配置文件中设置推流信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    {
    "version": "2.0.0",
    "resource": {
    "lists": [
    "/video/example_1.mp4",
    "/video/example_2.mp4"
    ]
    },
    "output": {
    "lists": [
    {
    "path": "rtmp://127.0.0.1:1935/push"
    }
    ]
    },
    "play": {
    "play_model": "loop",
    "cache_on": true,
    "encode": {
    "video_width": 854,
    "video_height": 480,
    "video_fps": 25,
    "audio_channel_layout": 3,
    "audio_sample_rate": 44100,
    "bit_rate": 0,
    "avg_quality": 0
    }
    }

    }

    参数解释:

    • play_model : 设置播放模式 这里我选择loop循环播放
    • cache_on : 是否开启缓存模式 开启后降低机器资源占用 提升推流性能
    • encode: 视频编码配置 比如帧率、码率、声音音质等等
    • resource->lists中填写需要进行播放的视频
    • output->lists填写需要推流的平台 这里支持多平台同时推流
  5. 创建并运行容器 并配置映射端口

    1
    2
    3
    4
    5
    6
    7
    8
    docker run -id \
    -v /root/living/video:/video \
    -v /root/living/config.json:/kplayer/config.json \
    -v /root/living/cache:/kplayer/cache \
    -v /root/living/log:/kplayer/log \
    --name=c_kplayer \
    -h c_kplayer \
    bytelang/kplayer:latest
  1. 效果测试

    此时 我们能看到已经可以接收到直播内容了

    image-20240424133753485

点击进入直播间

注意事项

一般来说config.json配置文件应该和video目录放在同一个文件夹下, 如果Kplayer报错提示找不到配置文件路径 我们可以为Kplayer设置home目录:

1
./kplayer play start --home /root/living

动态配置参数

如果我们想在视频播放过程中动态添加一些视频或者增加推流地址等 可以使用以下方法

首先需要进入到kplayer容器中:

1
docker exec -it c_kplayer /bin/sh
  1. 动态增加推流地址

    1
    kplayer output add "rtmp://127.0.0.1/live/new"
  2. 动态增加视频

    1
    kplayer resource add "/home/user/video/xxx.mp4"
  3. 动态添加插件

    1
    kplayer plugin add show-text mytext --param "fontsize=60" --param "text=newban.cn"

相关问题

关于容器启动失败

如果你在使用过程中 出现启动kplayer容器后 不一会儿就自动停止了 然后使用docker logs查看日志报如下错误:

1
level=error msg="core return error" code=-22 error="filter cannot loaded. filter name: drawtext. error: Invalid argument [-22]. file: codec/KPFilter.cpp. line: 201

这种情况 基本是出现在show-text插件上, 检查一下text属性是否填写正常的值 如果为空的话则会报错:

image-20240424105620385

关于水印修改后不生效的问题

当我们修改水印文字之后会发现只有新增的视频有效 而旧视频依然还是原来的那个水印 这主要是缓存导致 只需依次执行以下指令重启容器:

1
2
docker stop kplayer
docker start kplayer

或者前往/kplayer/cache目录清除相应的视频缓存即可

注意: 这个如果使用docker restart kplayer重启容器的话 缓存依然还在

相关文章

《使用Ant Media实现无人直播》

《使用ffmpeg实现无人直播》

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用Ant Media实现无人直播

发表于 2024-04-22

Ant Media

image-20240422214912243

其优势:

  • 支持多视频多平台推流
  • 内置GUI图形操作界面
  • 支持网络摄像机
  • 支持流录制转MP4

GitHub : 点击进入

官网 : 点击进入

无人直播前置需求

  • 云服务器一台 或者24开机联网运行的本地电脑
  • ffmpeg
  • 推流地址 (B站、抖音、斗鱼…)
  • 准备好不涉及侵权的视频内容

开始上手

这边使用docker容器快速安装使用

  1. 搜索ant-media-server镜像

    1
    docker search ant-media-server
  1. 拉取ant-media-server镜像

    1
    docker pull nibrev/ant-media-server
  2. 创建并运行容器 并配置映射端口

    1
    2
    3
    4
    5
    docker run -id \
    -p 5080:5080 \
    --name=c_ant \
    -h c_ant \
    nibrev/ant-media-server:latest
  3. 容器测试

    在浏览器输入http://服务器IP:5080检查是否能正常访问 并进入如下界面:

    image-20240422224143667

    注册账户并登陆后进入到控制面板页面:

    image-20240422224352619

  4. 上传视频

    点击LiveApp选项卡中的Vod然后上传视频

    image-20240423111224574

    接着点击New Liv Stream->PlayList将上传的视频链接填入待播放列表中:

    image-20240423112453142

  5. 添加推流地址

    关联直播流任务 然后点击Edit RTMP Endpoint添加推流地址 这里可以连续添加多个地址:

    image-20240423112731162

    image-20240423112833330

  6. 开始推流

    点击Start Broadcast开始推流

  7. 效果测试

    此时 我们能看到已经可以接收到直播内容了

    image-20240424133753485

    点击进入直播间

Ant Media的不足之处

  • 无法给视频添加字幕水印
  • 镜像体积过大 将近七百兆 国内下载速度比较慢 可能会存在镜像拉不下来的问题
  • 无法批量上传视频

相关文章

《使用ffmpeg实现无人直播》

《使用kplayer实现无人直播》

《使用Docker安装kplayer实现无人直播》

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

使用kplayer实现无人直播

发表于 2024-04-22

Kplayer官方介绍

kplayer为你提供最小化成本搭建视频推流功能的工具,最优的推流方案OBS或其他软件依赖与xWindow或图形化界面的需要,不适合在服务端与云服务器上进行部署。KPlayer无需依赖图形化界面,您可以使用任意一款你喜欢的发行版本即可实现多视频资源无缝推流的方案。

只需要定义您的配置文件,针对定制化的修改。即可达成想要的结果。并且可以24小时无人值守的方式运行它。

image-20240422205450337

其优势:

  • 支持多视频多平台推流
  • 支持添加图片水印字幕文字等功能
  • 内置视频缓存机制 对低配置机器比较友好
  • 自带后台运行
  • 免费开源

GitHub : 点击进入

官方文档 : 点击进入

无人直播前置需求

  • 云服务器一台 或者24开机联网运行的本地电脑
  • ffmpeg
  • 推流地址 (B站、抖音、斗鱼…)
  • 准备好不涉及侵权的视频内容

开始上手

  1. 安装Kplayer

    1
    curl -fsSL get.kplayer.net | bash

    执行完成之后输出下载进程与完整的文件列表

    1
    2
    3
    4
    5
    6
    7
    > curl -fsSL get.kplayer.net | bash
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 24.4M 100 24.4M 0 0 7377k 0 0:00:03 0:00:03 --:--:-- 7379k
    kplayer/
    kplayer/kplayer
    kplayer/config.json.example

    该指令默认下载最新版本, 如果你想下载旧版本 可以使用以下指令:

    1
    wget http://download.bytelang.cn/kplayer-v0.5.6-linux_amd64.tar.gz

    只需对版本号进行修改即可

  2. 修改配置文件

    kplayer安装完毕后 会有默认的配置文件kplayer/config.json 里面默认格式如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    {
    "version": "2.0.0",
    "resource": {
    "lists": [
    "/video/example_1.mp4",
    "/video/example_2.mp4"
    ]
    },
    "output": {
    "lists": [
    {
    "path": "rtmp://127.0.0.1:1935/push"
    }
    ]
    }
    }

    resource->lists中填写需要进行播放的视频output->lists填写需要推流的平台 这里支持多平台推送

    由于我需要对视频进行循环播放 因此在配置文件中需要对此进行声明:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    {
    "version": "2.0.0",
    "resource": {
    "lists": [
    "/video/example_1.mp4",
    "/video/example_2.mp4"
    ]
    },
    "output": {
    "lists": [
    {
    "path": "rtmp://127.0.0.1:1935/push"
    }
    ]
    },
    "play": {
    "play_model": "loop",
    "cache_on": true,
    "encode": {
    "video_width": 854,
    "video_height": 480,
    "video_fps": 25,
    "audio_channel_layout": 3,
    "audio_sample_rate": 44100,
    "bit_rate": 0,
    "avg_quality": 0
    }
    }

    }

    参数解释:

    • play_model : 设置播放模式 这里我选择loop循环播放
    • cache_on : 是否开启缓存模式 开启后降低机器资源占用 提升推流性能
    • encode: 视频编码配置 比如帧率、码率、声音音质等等
  3. 运行kplayer开始推流

    1
    ./kplayer play start

    将会看到以下输出信息并保持程序继续运行,即成功推流

    1
    2
    3
    4
    5
    6
    7
    8
    9
    kplayer for golang v0.5.8 Copyright(c) 2019-2023 the ByteLang Studio (https://kplayer.bytelang.cn)
    libkplayer version: v1.5.5 plugin version: 1.5.1 license version: v1
    toolchains GNU(10.3.1) C++ Standard 17 on Linux-x86_64-5.18.14-arch1-1
    build with build-chains cmake(3.22.3) type with Release
    Hope you have a good experience.
    -------------------------------------------------------------------------------------------------------------------
    INFO[2022-08-23 15:25:05] grpc server listening address=127.0.0.1 port=5157
    INFO[2022-08-23 15:25:05] http server listening address=127.0.0.1 port=5156
    INFO[2022-08-23 15:25:05] output add success
  4. 效果测试

    此时 我们能看到已经可以接收到直播内容了

    image-20240429182957862

点击进入直播间

后台运行kplayer

当我们退出终端时, 推流会被终端 为了确保24小时推流 我们需要将kplayer放在后台运行

这里kplayer已经给我们提供了后台运行的方式 只需加一个--daemon参数即可:

1
./kplayer play start --daemon

运行后将会输出成功日志:

1
INFO[2022-08-23 00:47:26] kplayer start success on daemon mode

当使用daemon模式后,所有的日志输出将会重定向到log/kplayer.log中,你可以查看这个文件来确定是否有异常情况发生

除了使用自带的方式之外 ,我们还可以使用第三方工具 比如nohup、systemctl、screen、tmux等

关闭KPlayer的运行

  1. 使用前台运行方式时,按下Ctrl+c结束运行
  2. 使用后台Daemon模式时,执行以下命令来结束KPlayer 的后台运行
1
./kplayer play stop

使用相关问题

关于视频推流卡顿的问题

如果出现视频卡顿 在无法提升带宽的前提下 最有效的方法就是降低视频分辨率

比如将分辨率设置为854x480 超过这个分辩率的视频会进行压缩 低于这个分辩率的 按照原视频分辩率

由于大部分直播平台使用的是1920x1080比例 所以如果视频需要铺满全屏的话需要按照这个比例等比进行放大或者缩小

关于视频推流kplayer报错checked play resource

当我们查看日志发现报错:level=info msg="checked play resource"

这种情况一般是视频本身的问题 可以考虑使用剪辑软件对视频重新进行编码导出

如果使用压缩工具 未必能解决问题 因为这个我已经试过了 没啥用👀

关于水印修改后不生效的问题

当我们修改水印文字之后会发现只有新增的视频有效 而旧视频依然还是原来的那个水印 这主要是缓存导致 只需要前往/kplayer/cache目录清除相应的视频缓存即可

关于多个视频推流衔接处花屏的问题

这个是底层框架的问题 暂时无解 最好的办法就是用剪辑软件将多个视频合成一个视频

个人使用感受

相比ffmpeg来说Kplayer功能更加丰富 但性能和稳定性不如ffmpeg 视频卡顿频繁 也可能是我还没把Kplayer摸索透

个人感觉FFmpeg>>Kplayer>>Ant Media Server

相关文章

《使用Ant Media实现无人直播》

《使用ffmpeg实现无人直播》

《使用Docker安装kplayer实现无人直播》

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

123…50

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

491 日志
143 标签
RSS
© 2025 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%