利用闲置服务器搭建无人直播实现24小时无人值守直播

  • 编译ffmpeg

    为什么说在 linux 上编译安装 ffmpeg 最复杂?因为编译之前我们要安装很多扩展库,每个人的环境不同,要安装的编解码库或多或少都有些区别。

linux下安装 ffmpeg,我们以 centos7 编译安装为例。

先看下系统环境

[root@localhost vagrant]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
1、安装依赖
yum install autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel

如果安装依赖的过程中,报如下错误

File "/bin/yum", line 30except KeyboardInterrupt, e:
或者
updates                                                                                                                                                       | 2.9 kB  00:00:00File "/usr/libexec/urlgrabber-ext-down", line 28except OSError, e:

则优先看下默认的 python 是 2.x 的还是 3.x 的,如果是 3.x 的建议改成 2.x 的再试试。

2、安装一些必须的编解码库
1)编译 nasm

nasm即Netwide Assembler,是一款基于英特尔 x86 架构的汇编与反汇编工具。新版ffmpeg以及x264、x265依赖的汇编器。 需要注意的是,nasm是英特尔x86平台汇编器,不需要交叉编译,如果是arm等其他平台,交叉编译 ffmpeg 时需要添加选项 --disable-x86asm。

cd /opt/ffmpeg
curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
tar xjvf nasm-2.15.05.tar.bz2
cd nasm-2.15.05
./autogen.sh
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
ln -s /opt/ffmpeg/nasm /usr/bin/nasm
2)编译 yasm

yasm, 旧版本的ffmpeg以及x264、x265依赖的汇编器。yasm同nasm,也是x86平台汇编器,同样不需要交叉编译,如果是arm等其他平台,交叉编译 ffmpeg 时需要添加选项 --disable-yasm。

cd /opt/ffmpeg
curl -O -L https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
ln -s /opt/ffmpeg/yasm-1.3.0/yasm /usr/bin/yasm
3)编译 libx264

x264是开源的h264编码器,ffmpeg 本身自带了h264解码器,但是没有h264编码器,所以我们这里安装第三方编码器x264。

cd /opt/ffmpeg
git clone --branch stable --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
make
make install

有些小伙伴在编译 x264 的时候,可能会报错 Found no assembler, Minimum version is nasm-2.13, If you really want to compile without asm, configure with --disable-asm,这个就说明你电脑上还存在其他的太老的 nasm,或者我们在第一步创建的 nasm 你没有添加到环境变量中导致的,一定要确保 nasm -v 是我们第一步新安装的包。设置好之后,x264 就可以从 ./configure 这里继续安装了。

4)编译libx265

x265等同于x264,它是开源的h265编码器,ffmpeg 本身自带了h265解码器,但是没有h265编码器,所以我们这里安装第三方编码器x265。

cd /opt/ffmpeg
git clone --branch stable --depth 2 https://bitbucket.org/multicoreware/x265_git
cd cd x265_git/build/linux
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make
make install
5)编译libfdk_aac
cd /opt/ffmpeg
git clone --depth 1 https://github.com/mstorsjo/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
6)编译libmp3lame

libmp3lame是开源的mp3编码器。

cd /opt/ffmpeg
curl -O -L https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
tar xzvf lame-3.100.tar.gz
cd lame-3.100
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
make
make install
7)编译libopus
cd /opt/ffmpeg
curl -O -L https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz
tar xzvf opus-1.3.1.tar.gz
cd opus-1.3.1
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make
make install
8)编译libvpx
cd /opt/ffmpeg
git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make
make install

如果 libvpx 的代码拉不下来,可以试试下面这种方式,其他步骤不变

wget  https://github.com/webmproject/libvpx/archive/refs/tags/v1.10.0.tar.gz
tar zxvf v1.10.0.tar.gz
cd libvpx-1.10.0

编译是个漫长的过程,到此我们已经成功了一半,下面我们编译安装今天的主角 ffmpeg

3、编译安装ffmpeg

下载最新的稳定包并开始编译安装

cd /opt/ffmpeg
curl -O -L https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
tar xjvf ffmpeg-snapshot.tar.bz2
cd ffmpeg
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \--prefix="$HOME/ffmpeg_build" \--pkg-config-flags="--static" \--extra-cflags="-I$HOME/ffmpeg_build/include" \--extra-ldflags="-L$HOME/ffmpeg_build/lib" \--extra-libs=-lpthread \--extra-libs=-lm \--bindir="$HOME/bin" \--enable-gpl \--enable-libfdk_aac \--enable-libfreetype \--enable-libmp3lame \--enable-libopus \--enable-libvpx \--enable-libx264 \--enable-libx265 \--enable-nonfree
make
make install
hash -d ffmpeg
ln -s /opt/ffmpeg/ffmpeg/ffmpeg /usr/bin/ffmpeg

最后验证下是否安装成功

$ ffmpeg -version
ffmpeg version N-102343-g4d3474432f Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44)
configuration: --prefix=/root/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --extra-libs=-lpthread --extra-libs=-lm --bindir=/root/bin --enable-gpl --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree
libavutil      57.  0.100 / 57.  0.100
libavcodec     59.  0.100 / 59.  0.100
libavformat    59.  0.100 / 59.  0.100
libavdevice    59.  0.100 / 59.  0.100
libavfilter     8.  0.101 /  8.  0.101
libswscale      6.  0.100 /  6.  0.100
libswresample   4.  0.100 /  4.  0.100
libpostproc    56.  0.100 / 56.  0.100
  • centos 彻底卸载python
1、通过yum命令卸载Python相关的包:
sudo yum remove -y python*
2、确认Python是否已经卸载完毕:
which python
如果没有任何输出,则说明Python已经彻底卸载了。
3、如果仍有Python残留文件,可以手动删除:
sudo rm -rf /usr/local/bin/python*
sudo rm -rf /usr/local/lib/python*
sudo rm -rf /usr/local/include/python*
sudo rm -rf /usr/local/share/python*
sudo rm -rf /usr/local/man/man1/python*
sudo rm -rf /usr/local/man/man3/python*
注意:上述命令会删除Python相关的所有文件,包括其他软件可能依赖的Python文件,因此请谨慎操作。
4、清理Python缓存:
sudo find / -name __pycache__ | xargs sudo rm -rf
该命令会查找系统中所有的Python缓存文件并删除,以确保Python已经彻底卸载。
请注意备份重要数据,以免误操作造成数据丢失。5、重新安装python3并加入path 6、下载Python3压缩包
wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
7、解压压缩包
tar -xzvf Python-3.9.5.tgz
8、进入Python目录并编译安装
cd Python-3.9.5
./configure --prefix=/usr/local/python3
make
sudo make install
9、将Python3添加到PATH中
echo "export PATH=/usr/local/python3/bin:$PATH" >> ~/.bashrc
source ~/.bashrc
10、验证Python3是否安装成功
python3 -V
python推流代码
import os
import subprocesspush_url = "rtmp://hs.direct.huya.com/huyalive/1638767414-1638767414-7229340556173281738-3277658284-10057-A-1683212598-1?seq=1683289932825&type=simple"
video_dir = "/home/videoList"while True:video_list = os.listdir(video_dir)for video_file in video_list:cmd = f"ffmpeg -re -i {os.path.join(video_dir, video_file)} -vcodec copy -acodec copy -f flv '{push_url}'"subprocess.call(cmd, shell=True)
  • 代码更新
# import os
# import subprocess# push_url = "rtmp://hs.direct.huya.com/huyalive/1638767414-1638767414-7229340556173281738-3277658284-10057-A-1683212598-1?seq=1683378101420&type=simple"
# video_dir = "/home/videoList"# while True:
#     video_list = os.listdir(video_dir)
#     for video_file in video_list:
#         cmd = f"ffmpeg -re -i {os.path.join(video_dir, video_file)} -vcodec copy -acodec copy -f flv '{push_url}'"
#         subprocess.call(cmd, shell=True)
import os
import subprocess
import timepush_url = "rtmp://hs.direct.huya.com/huyalive/1638767414-1638767414-7229340556173281738-3277658284-10057-A-1683212598-1?seq=1683384874395&type=simple"
video_dir = "/home/videoList"# ffmpeg_cmd = "ffmpeg -re -i {} -vcodec libx264 -preset veryfast -crf 23 -acodec aac -b:a 128k -f flv '{}'"while True:video_list = sorted(os.listdir(video_dir))for video_file in video_list:video_path = os.path.join(video_dir, video_file)cmd = f"ffmpeg -re -i {os.path.join(video_dir, video_file)} -vcodec copy -acodec copy -f flv '{push_url}'"subprocess.call(cmd, shell=True)time.sleep(0.1)
linux服务器需要
  • 1、安装python3 (python2有些问题不兼容ffmpeg新版本-部分指令运行报错)

  • 2、安装ffmpeg并编译

  • 3、nginx配置 与http平级

    rtmp {
    server {
    listen 1935;
    application live {
    live on;
    record off;
    push rtmp://your-push-url;
    }
    }
    }

  • 4、运行python脚本

    python3 live_stream.py

  • 5、查询直播进程id

ps aux | grep python3 | grep live_stream.py

查询结果

root     11564  0.0  0.3 138968  6940 pts/0    S+   21:55   0:00 python3 live_stream.py

如上 11564 就是直播占用的进程id

如果直播出现问题 那就执行

kill 11564

干掉这个进程后重新运行脚本
如果这个进程无法结束掉用下边的强制结束进程

kill -9 11564
  • 6、脚本后台运行可以关闭终端

    nohup python3 live_stream.py &

此案例仅以虎牙直播演示开发,具体效果请打开虎牙并查看任意电影电视剧直播间,效果一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

岗位实习最终篇(汇总)——人力资源管理系统(包含DDL,DML,视图,简单/复杂查询,触发器语句和存储过程语句)

DDL CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 员工ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,first_name VARCHAR(50) NOT NULL COMMENT 名,last_name VARCHAR(50) NOT NULL COMMENT…

LLM探索:环境搭建与模型本地部署

前言 最近一直在炼丹(搞AIGC这块),突然发现业务代码都索然无味了… 上次发了篇AI画图的文章,ChatGPT虽然没法自己部署,但现在开源的LLM还是不少的,只要有一块差不多的显卡,要搞个LLM本地部署还…

音视频开发32 FFmpeg 编码- 视频编码 h264 参数相关

1. ffmpeg -h 这个命令总不会忘记,用这个先将ffmpeg所有的help信息都list出来 C:\Users\Administrator>ffmpeg -h ffmpeg version 6.0-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 pro…

单点登录(cookie+Redis)

1、什么是单点登录? Single Sign On简称SSo,只需要登录一次就可以在整个系统实现访问。 因为session的特性,是没有办法在多个服务系统之间实现数据的共享。 解决一个分布式session的问题。目前我们使用redis来实现分布式session。 1.1、新问题…

2000-2021年县域金融机构存贷款数据

2000-2021年县域金融机构存贷款数据 1、时间:2000-2021年 2、指标:统计年度、地区编码ID、县域代码、县域名称、所属地级市、所属省份、年末金融机构贷款余额/亿元、年末金融机构存款余额/亿元、年末城乡居民储蓄存款余额/亿元 3、来源:县…

[OtterCTF 2018]Graphic‘s For The Weak

恶意软件的图形中有些可疑之处。 软件图形 ???这里的恶意文件都是 vmware-tray.ex使用procdump转存进程的可执行文件 (可执行的)导出了 ,看文件里面是否存在 图片 volatility.exe -f .\OtterCTF.vmem --pro…

3.3V到5V的负电源产生电路(电荷泵电压反相器)SGM3204输出电流0.2A封装SOT23-6

前言 SGM3204 非稳压 200mA 电荷泵负电源产生电路,LCEDA原理图请访问资源 SGM3204电荷泵负电源产生电路 SGM3204电荷泵负电源产生电路 一般描述 SGM3204从 1.4V 至 5.5V 的输入电压范围产生非稳压负输出电压。 该器件通常由 5V 或 3.3V 的预稳压电源轨供电。由于…

网盘挂载系统-知识资源系统-私域内容展示系统

系统介绍: 存储:一共支持约30款云盘存储,其中包括主流的(百度网盘、阿里云盘、夸克云盘、迅雷云盘、蓝奏云、天翼云盘),部分展示 以及特别的(一刻相册、对象存储、又拍云存储、SFTP、MEGA 网盘…

【Linux】解锁并发:多线程同步技术详解与应用实践

文章目录 前言:1. 同步概念2. 条件变量:实现线程间同步的!2.1. 条件变量是什么?2.2. 认识条件变量接口 3. 写一个测试代码——验证线程的同步机制4. 生产消费模型5. 生产消费模型 条件变量6. 线程池7. 可重入 VS 线程安全7.1. 概…

python代码缩进规范(2空格或4空格)

C、C、Java、C#、Rust、Go、JavaScript 等常见语言都是用"{“和”}"来标记一个块作用域的开始和结束,而Python 程序则是用缩进来表示块作用域的开始和结束: 作用域是编程语言里的一个重要的概念,特别是块作用域,编程语言…

leetcode-20-回溯-切割、子集

一、[131]分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ] 分析&…

让GNSSRTK不再难【第17讲 RTK定位技术原理-站间单差浮点解--第2部分】

17.3 浮点解Kalman滤波 Kalman滤波过程与第16讲中伪距差分的滤波流程基本相同,但由于引入了载波观测值,并且要考虑模糊度参数的时间序列建模问题。 在没有周跳的情况下,每个模糊度的转移系数为1,即认为上一个历元的值等于本历元的值。然后附加一个 Q Q Q 阵,表示转移过…

运维锅总详解Nginx

本文尝试从Nginx特性及优缺点、为什么具有文中所述的优缺点、Nginx工作流程、Nginx最佳实践及历史演进等角度对其进行详细分析。希望对您有所帮助。 Nginx特性及优缺点 Nginx简介 Nginx(发音为 “engine-x”)是一款高性能的开源Web服务器及反向代理服…

前后端分离的后台管理系统开发模板(带你从零开发一套自己的若依框架)上

前言: 目前,前后端分离开发已经成为当前web开发的主流。目前最流行的技术选型是前端vue3后端的spring boot3,本次。就基于这两个市面上主流的框架来开发出一套基本的后台管理系统的模板,以便于我们今后的开发。 前端使用vue3ele…

狼人杀系列

目录 杀人游戏(天黑请闭眼) (1)入门版 (2)标准版 (3)延伸版——百度百科 (3.1)引入医生和秘密警察 (3.2)引入狙击手、森林老人和…

Python WebSocket自动化测试:构建高效接口测试框架

为了更高效地进行WebSocket接口的自动化测试,我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架,并重点关注以下四个方面的内容:运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…

50-2 内网信息收集 - 内网工作环境(域相关知识)

一、工作组 工作组(Work Group)是局域网中最基本的资源管理模式,适用于小规模网络环境。 工作组的定义: 工作组是将不同功能或部门的计算机分组管理的方式。它提供了层次化的网络资源管理,使得组织内的计算机可以按照功能或部门分类。每个工作组有一个自定义的主机名称,…

牛客周赛 Round 48-D.小红的乘2除2

题目链接 D-小红的乘2除2_牛客周赛 Round 48 (nowcoder.com) 解析&#xff1a; 用DP来推&#xff0c;好理解&#xff0c;但是容易出错。 #include <bits/stdc.h> using namespace std; #define endl \n #define int long long // int gcd(int a, int b) { return b ?…

1-爬虫基础知识(6节课学会爬虫)

1-爬虫基础知识&#xff08;6节课学会爬虫&#xff09; 1.什么是爬虫2.爬取的数据去哪了3.需要的软件和环境4.浏览器的请求&#xff08;1&#xff09;Url&#xff08;2&#xff09;浏览器请求url地址&#xff08;3&#xff09;url地址对应的响应 5.认识HTTP/HTTPS5.1 http协议之…

海康+libtorch的血泪教训

一、LibTorch使用&#xff0c; 详见&#xff1a; /INCLUDE:?warp_sizecudaatYAHXZ 二、海康二次开发&#xff0c; 目前选4.31&#xff0c;只能c14。 三、做dll注意&#xff1a;