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

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


  • 首页

  • 归档

  • 搜索

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

发表于 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下载的方式可以将整站的静态网页和相对路径资源打包下载到本地 有点类似于整站克隆

使用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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/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//\'/}

    # 定义信号处理函数,当 iterm 执行失败,则使用默认终端
    function signal_handler() {
    # 切换到当前目录
    cd "$thePath"
    bash -i
    }

    # 注册信号处理函数
    trap signal_handler ERR INT TERM

    # 尝试打开 iTerm 终端
    if ! open -a iTerm "$thePath"; then
    # 如果打开失败,则手动触发错误信号
    echo "Failed to open iTerm"
    kill -s ERR $$
    fi
  2. 一键打开 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"
  3. 一键登录服务器

    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
  4. 一键启动静态服务器,并加载当前目录

    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"

关于应用图标的更换

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

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

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

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

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
    w get 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实现无人直播》

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

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

使用ffmpeg实现无人直播

发表于 2024-04-21

环境搭建

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

ffmpeg安装

我这边以ubuntu的云服务器为例给大家介绍

执行以下指令进行安装:

1
2
sudo apt-get update
sudo apt-get install ffmpeg

推流地址的获取

这里以B站直播平台为例 首先登陆哔哩哔哩直播 进入直播中心:

image-20240421221920492

然后开通直播间 这里需要进行实名认证:

image-20240421222031398

image-20240421222114948

由于实名认证太过麻烦 扫码半天扫不上 于是决定转战微信视频号直播 然而同样也需要各种认证 最后头大的我 又回到了B站😂

后来我发现二维码迟迟扫不上的原因是 手机登录的账号和电脑端登录的账号不一致 也是很无语 也没有个提示 只能靠试🤦‍♀️

好不容易扫码成功 进入实名认证页面 居然app存在bug提示人脸SDK初始化失败 哎😔

最后我下载了一个抖音直播伴侣

需要有一千粉丝才能开 咳咳 这个条件我已经满足了😃

不过凭心而论 B站直播是门槛最低的 接下来还是以B站直播为例 我使用老版本的哔哩哔哩app通过了实名认证, 然后进入到直播中心 点击开播设置选项卡:

image-20240423123033651

往下拉能看到服务器地址和密钥:

image-20240423123137063

推流地址=服务器地址+串流密钥

将两者组合在一起就能得到一个推流地址 如下:

1
rtmp://live-push.bilivideo.com/live-bvc/?streamname=live_485691562_50807751&key=afxxxxx99e2552f502129ba17a5b0&schedule=rtmp&pflag=1

开始推流

  1. 单个视频循环播放

    执行以下指令开始循环播放视频:

    1
    ffmpeg -re -stream_loop -1 -i "xxx.mp4" -c copy -f flv "推流地址"
  2. 多个视频挨个播放

    如果我们有多个视频需要进行挨个播放 那么我们需要创建一个文本文件 如need_play.txt 然后将视频绝对路径写入该文本中, 如下:

    1
    2
    file '/root/xxx/视频1.mp4'
    file '/root/xxx/视频2.mp4'

    然后执行以下指令开始播放:

    1
    ffmpeg -f concat -safe 0 -i /root/need_play.txt -c copy -f flv "推流地址"
  3. 多个视频循环播放

    上面多个视频挨个播放指令 一旦文本中的视频播放完 推流就会终止, 如果我们想从头到尾无限循环播放 那么我们可以使用shell脚本 将指令放入while循环中 如下:

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    while true
    do
      ffmpeg -f concat -safe 0 -i /root/need_play.txt -c copy -f flv "推流地址"
    done
    echo "所有视频播放完毕"

    然后运行该脚本:

    1
    ./xxx.sh

效果测试

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

image-20240424133753485

点击进入直播间

将视频同时推到多个直播平台

如果我们想将视频同时推到多个直播平台, 可以使用以下指令:

1
ffmpeg  -re -stream_loop -1 -i input_video.mp4  -c copy -f flv "推流地址1" -c copy -f flv "推流地址2"

如果需要配置视频参数可以使用类似于下面的指令:

1
2
3
4
5
6
7
ffmpeg -re -stream_loop -1  -i input_video.mp4 \
-c:v libx264 -preset fast -b:v 2500k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 44100 \
-f flv "推流地址1" \
-c:v libx264 -preset fast -b:v 2500k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 44100 \
-f flv "推流地址2"

参数解释:

  • -c:v libx264 指定视频编码器为x264(H.264)。
  • -preset fast 设置编码预设,影响编码速度和质量。
  • -b:v 2500k 设置视频比特率为2500kbps。
  • -maxrate 和 -bufsize 用于控制编码的比特率变化。
  • -pix_fmt yuv420p 设置像素格式,常用于兼容性。
  • -c:a aac 指定音频编码器。
  • -b:a 128k 设置音频比特率。
  • -ar 44100 设置音频采样率。
  • -f flv 指定输出格式为FLV,这是直播常用的格式。
  • 目标URL和推流密钥。

Python脚本

如果你想实现一个大而全的功能, 那么可以考虑使用python写一个脚本, 如下:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import os
import subprocess
import time


def stream_to_multiple_platforms(video_path, stream_urls):
# 构建FFmpeg命令
ffmpeg_command = ['ffmpeg', '-re', '-i', video_path]

# 为每个流地址添加输出参数
for url in stream_urls:
ffmpeg_command.extend(['-c', 'copy', '-f', 'flv', url])

# 使用subprocess启动FFmpeg进程
ffmpeg_process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 等待进程结束
ffmpeg_process.wait()

def main():
# 指定要循环播放的视频文件或文件夹路径
video_path = "your_video_path_or_folder"

# 指定多个推流地址
stream_urls = [
"rtmp://example.com/live/stream1",
"rtmp://example.com/live/stream2"
# 在此添加更多的推流地址
]

if os.path.isfile(video_path):
# 如果路径指向单个文件,循环播放该视频
while True:
stream_to_multiple_platforms(video_path,stream_urls)
elif os.path.isdir(video_path):
# 如果路径指向文件夹,循环播放文件夹内的所有视频并推流到多个平台
while True:
for root, dirs, files in os.walk(video_path):
for file in files:
if file.endswith((".mp4", ".avi", ".mkv")):
video_file_path = os.path.join(root, file)
# 循环播放视频
play_video(video_file_path)
# 同时推流到多个平台
stream_to_multiple_platforms(video_file_path, stream_urls)
else:
print("Invalid video path or folder path.")

if __name__ == "__main__":
main()

上面代码实现了将文件夹中的视频挨个循环推流到多个直播平台 后期可根据需求增减推流地址

直播转播

如果你想将网络的上直播或者视频进行转播 比如将国外的直播转到国内B站播放, 那么FFmpeg也可以实现, 指令如下:

1
ffmpeg -re -stream_loop -1 -i 视频网络地址 -c copy -f flv "推流地址"

关于获取网络直播的m3u8地址

  1. 方法一 : 使用谷歌插件进行嗅探 比如猫抓

    image-20240423192631757

  2. 方法二 : 使用本地抓包工具 或者浏览器开发者工具拦截

  3. 方法三 : 使用命令行工具

    以youtube直播为例 使用以下指令可以获取到该直播的m3u8地址:

    1
    yt-dlp -g https://www.youtube.com/live/ydYDqZQpim8?si=fFDeIHwOO5Xrf9qb

相关文章

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

《使用kplayer实现无人直播》

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

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

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

关于安装nodejs指定版本

发表于 2024-04-20

前言

最近升级了nodejs版本为最新的v21.7.3版本后, Hexo博客在使用hexo d指令时突然报错, 如下:

1
TypeError [ERR_INVALID_ARG_TYPE]: The "mode" argument must be of type number. Received an instance of Object

为了减少折腾 于是乎我将版本回退到v12.17.0后问题解决

方法很简单 如下

版本回退

  1. 安装nvm

    1
    sudo npm install n
  2. 安装指定版本的nodejs

    1
    sudo n install 12.17.0

关于marked模块报错的问题

报错如下:

1
2
node_modules/marked/lib/marked.cjs:870
cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';

这主要是高版本的marked和nodejs版本不兼容的问题 导致语法无法识别 这是nodejs值得吐槽的一点 语法一直在更新 居然不能向前兼容 妥妥的坑开发者😒

解决方案有两个:

  1. 要么更新nodejs版本

    1
    nvm install latest
  2. 要么降低marked版本, 比如2.0.0

    1
    npm install marked@2.0.0

高版本和低版本的引用方式也不同 不然会提示TypeError: marked is not a function:

1
2
3
4
//高版本
const {marked} = require('marked')
//低版本
const marked = require('marked')

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

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

12…48

乱码三千

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

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