音视频开发2. FFMPEG+Nginx实现推流服务
liebian365 2024-11-22 17:12 23 浏览 0 评论
一、说明
1. 业务场景
- 直播源是rtsp或rtmp等,播放端不支持直接播放rtsp(如网页播放)
- 源视频带宽和负载有限,不支持很多用户访问
- 客户端点播
2. 流程
- 使用ffmpeg从节目源拉流
- 推流到nginx-rtmp/flv服务
- 客户端从nginx服务器拉流观看视频
3. 本文工具
- ffmpeg
- nginx
- VLC(用来测试拉流)
以下两个模块选择一个安装:
- nginx-http-flv-module
- nginx-rtmp-module
其实nginx flv也是基于nginx-rtmp-module的流媒体服务器。
功能对比:
功能nginx-http-flv-modulenginx-rtmp-module备注HTTP-FLV (播放)√x支持HTTPS-FLV和chunked回复GOP缓存√x虚拟主机√x省略listen配置√见备注配置中必须有一个listen纯音频支持√见备注wait_video或wait_key开启后无法工作定时打印访问记录√xJSON风格的stat√x
二、FFMPEG 的安装
1. Ubuntu环境
(1) apt-get安装
# 可通过PPA进行安装
sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
sudo apt-get update
sudo apt-get install ffmpeg
# 查看是否安装成功:
ffmpeg -version
(2) 编译安装
sudo apt-get install -y autoconf automake build-essential git libass-dev libfreetype6-dev libsdl2-dev
sudo apt-get install -y libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev
sudo apt-get install -y nasam yasm cmake mercurial
./configure --enable-shared --prefix=/usr/local/ffmpeg --disable-x86asm
sudo make
sudo make install
在 /etc/ld.so.conf中,末尾添加 /usr/local/ffmpeg/lib,执行sudo ldconfig
为 ffmpeg 加入环境变量
vi /etc/profile
加入以下内容:
export PATH="/usr/local/ffmpeg/bin:$PATH"
然后保存并运行source /etc/profile
2. CentOS7(支持nVidia硬件解码)
硬件环境:nVidia 20602块
(1) 安装nVidia驱动
(A) yum方式安装nVidia驱动
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum install yum-plugin-fastestmirror
sudo vim /lib/modprobe.d/dist-blacklist.conf
dist-blacklist.conf
#blacklist nvidiafb
blacklist nouveau
options nouveau modeset=0
mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
dracut /boot/initramfs-$(uname -r).img $(uname -r)
lspci | grep nouveau
没有输出,说明屏蔽默认带有的nouveau成功。
一些命令:
sudo yum install nvidia-detect nvidia显卡检测
nvidia-detect -v 检测结果
# yum -y install kmod-nvidia 安装显卡驱动 这一步应该不需要
(B) run脚本方式安装nVidia驱动
参考:https://github.com/keylase/nvidia-patch
cd /opt/nvidia
wget https://international.download.nvidia.com/XFree86/Linux-x86_64/430.40/NVIDIA-Linux-x86_64-430.40.run
chmod +x NVIDIA-Linux-x86_64-430.40.run
./NVIDIA-Linux-x86_64-430.40.run --kernel-source-path=/usr/src/kernels/3.10.0-957.27.2.el7.x86_64
# 下面是移除NVENC同时运行最大数量的限制 restriction on maximum number of simultaneous NVENC
git clone https://github.com/keylase/nvidia-patch
cd nvidia-patch
bash ./patch.sh
如果需要卸载,使用命令:
./NVIDIA-Linux-x86_64-430.40.run --uninstall
(2) 安装Cuda
参考
sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo
sudo yum clean all
sudo yum -y install nvidia-driver-latest-dkms cuda
nvidia-smi
(3) 编译ffmpeg的准备工作
(i) 库说明
- x264 编码H.264视频,编译参数–enable-gpl --enable-libx264
- fdk-aac 编码AAC音频,编译参数–enable-libfdk-aac
- libvpx VP8/VP9视频编码器,编译参数–enable-libvpx
- libvorbis 编码Vorbis音频,需要libogg。编译参数–enable-libvorbis
- libopus 编码Opus音频。
- LAME 编码MP3音频,编译参数–enable-libmp3lame
- libass 字幕渲染器,编译参数–enable-libass
(ii) 下载路径
mkdir ~/ffmpeg_sources
(iii) 配置库
yasm
cd ~/ffmpeg_sources
curl -L -O http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xvzf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix=”/usr”
make
sudo make install
nasm
curl -L -O http://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.xz
tar xf nasm-2.14.02.tar.xz
cd nasm-2.14.02
./configure --prefix=”/usr”
make
sudo make install
libfdk-aac
git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac
cd fdk-aac
sudo autoreconf -fiv
./configure --prefix="/usr" --disable-shared
make
sudo make install
lame
curl -L -O http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar xzvf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure --prefix="/usr" --disable-shared --enable-nasm
make
sudo make install
libopus
curl -L -O https://archive.mozilla.org/pub/opus/opus-1.2.tar.gz
tar xvzf opus-1.2.tar.gz
cd opus-1.2
./configure --prefix="/usr" --disable-shared
make
sudo make install
libogg
curl -L -O http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz
tar xzvf libogg-1.3.2.tar.gz
cd libogg-1.3.2
./configure --prefix="/usr" --disable-shared
make
sudo make install
libvorbis
curl -L -O http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz
tar xzvf libvorbis-1.3.4.tar.gz
cd libvorbis-1.3.4
./configure --prefix="/usr" --with-ogg="/usr" --disable-shared
make
sudo make install
libtheora
git clone git://git.xiph.org/mirrors/theora.git theora-git
cd theora-git
PKG_CONFIG_PATH=/usr/lib/pkgconfig ./autogen.sh --prefix=/usr --disable-examples --disable-shared --disable-sdltest --disable-vorbistest && make && make install
libx265
sudo yum install hg cmake
hg clone http://hg.videolan.org/x265
cd x265/build/linux
sudo cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="/usr" -DENABLE_SHARED:bool=off ../../source
make
sudo make install
vim /usr/lib/pkgconfig/x265.pc
加上:在Libs.private: -lstdc++ -lm -lrt -ldl后面加上-lpthread
x264
curl -L -O http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
tar xjvf last_x264.tar.bz2
cd x264-snapshot-20170625-2245/
./configure --prefix="/usr" --enable-static
make
sudo make install
disable-gpl
./configure --prefix="/usr" --enable-static --disable-gpl --disable-opencl
make
sudo make install
安装ffnvcodec
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
make && sudo make install
libvpx
VP8/VP9 video encoder.
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix="/usr" --disable-examples --disable-unit-tests --as=yasm
make
sudo make install
https
wget http://mirrors.ibiblio.org/openssl/source/old/1.0.2/openssl-1.0.2k.tar.gz
tar -xvf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k
make clean
./config shared --prefix="/usr"
make -j32 && make install
(4) 配置ffmpeg, 编译安装
(i) 下载
git clone https://git.ffmpeg.org/ffmpeg.git
git clone https://github.com/libav/libav
(ii) 配置
PKG_CONFIG_PATH="/usr/lib/pkgconfig"
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
cd ffmpeg
./configure --prefix="/usr" --pkg-config-flags="--static" --enable-gpl --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libxvid --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree --extra-cflags="-I/usr/local/cuda/include/" --extra-ldflags=-L/usr/local/cuda/lib64 --disable-shared --enable-nvenc --enable-cuda --enable-cuvid --enable-libnpp --enable-pthreads --enable-openssl
我实际编译去掉了–enable-libfdk-aac enable-libxvid
(iii) 编译
make -j 10
(iv) 安装
make install
(5) 使用示例
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i "rtsp://admin:adminpassword@ip:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif" -c:v h264_nvenc -an -preset slow -tune film -f flv rtmp://rtmpip:port/live/v_test```
三、nginx的rtmp/flv模块安装
1. CentOS7环境
(1) 安装nginx-http-flv-module模块
A. 通过nginx.conf
yum install https://extras.getpagespeed.com/release-el$(rpm -E %{rhel})-latest.rpm
yum install nginx-module-flv
- 安装完毕后,HTTP-FLV功能的配置文件http-flv.conf和RTMP功能的配置文件rtmp.conf会被放在/etc/nginx/http-flv目录下
- 通过include手工将它们添加到/etc/nginx/nginx.conf,以开启HTTP-FLV和RTMP功能:
http {
...
include /etc/nginx/http-flv/http-flv.conf;
}
include /etc/nginx/http-flv/rtmp.conf;
# 添加以下配置到/etc/nginx/nginx.conf,启动或者重启NGINX来启用本模块:
load_module modules/ngx_http_flv_live_module.so;
# 注意
# 上述的配置必须位于events配置项之前,否则NGINX不能启动。
# 更新可以通过yum update来完成。关于其他NGINX模块的详情见GetPageSpeed。
B. 源码编译安装
cd root
git clone https://github.com/winshining/nginx-http-flv-module
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --add-module=/root/nginx-http-flv-module --with-http_ssl_module
make && make install
(2) 安装 nginx-rtmp-module
# 下载nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
# 编译安装nginx
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_ssl_module
make && make install
# 设置nginx
vi /usr/local/nginx/conf/nginx.conf
nginx.conf内容
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 809;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
rtmp {
out_queue 4096;
out_cork 8;
max_streams 4096;
server {
listen 90;
drop_idle_publisher 30s;
application live {
live on;
}
}
}
# 启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 如果要卸载
# 如果有自启动,则删除 Nginx 的自启动
chkconfig nginx off
服务 nginx 信息读取出错:没有那个文件或目录
# 查找nginx的安装目录
whereis nginx
nginx: /usr/local/nginx
# 停止nginx服务
/usr/local/nginx/sbin/nginx -s stop
# 删除安装目录
rm -rf /usr/local/nginx/
# 查找是否还有残余的
find / -name nginx
/usr/local/lib64/nginx-1.15.7/objs/nginx
rm -rf /usr/local/lib64/nginx-1.15.7/
2. windows环境安装nginx-rtmp
(1) 下载
官方的nginx不带rtmp模块,在下面地址可下载windows版本的nginx+rtmp:
https://github.com/illuspas/nginx-rtmp-win32
使用:nginx-rtmp-win32-1.2.1.zip
(2) 配置文件
nginx.conf
worker_processes 1;
error_log logs/error.log debug;
events {
worker_connections 1024;
}
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /tmp;
rtmp {
out_queue 4096;
out_cork 8;
max_streams 4096;
server {
listen 90;
drop_idle_publisher 30s;
application live {
live on;
}
}
}
http {
server {
listen 80;
location / {
root html;
}
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root html;
}
}
}
/tmp需要有可写权限。
上面示例中的推流/拉流地址
http://ip:90/live/test
四、测试
# 推流测试
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i "视频资源源地址" -c:v h264_nvenc -an -crf 20 -b:a 96k -b:v 2048k -preset medium -tune animation -vf scale_npp=1024:-1 -f flv rtmp://ip:90/live/test
# 拉流测试
使用VLC Media Player打开网址: rtmp://ip:90/live/test
- 上一篇:大数据存储:HBase安装与配置快速入门
- 下一篇:Hbase的学习,了解Hbase
相关推荐
- Linux-常用操作命令介绍(linux常用的命令大全)
-
1.帮助命令帮助命令1.1help命令语法格式:命令--help作用:查看某个命令的帮助信息示例#ls--help#netstat--help1.2man命令语法格式:man命令...
- 推荐:一个小而美的Java工具类库(java工具软件)
-
前言是的,你没看错,没看错,它就是hutool!相信很多做java开发的朋友应该都已经认识并使用过它了,今天带大家再重温一下它都有哪些功能,并以示例来看看hutool是如何简便实现JWT认...
- 【SpringBoot后端开发】第三部分 Linux操作系统常用命令(3)
-
创作不易,请帮忙转发、点赞和评论!四、Linux常用命令对于Linux系统来说,中央处理器、内存、磁盘驱动器、键盘、鼠标、用户等都是文件,而Linux系统管理的命令是它正常运行的核心,与之DOS命令类...
- linux常用命令在线查询工具(linux常用命令在线查询工具有哪些)
-
linuxvi编辑器常用命令linux查看iplinuxfind-name查找文件名linuxshelllinux查看端口占用linux删除文件命令linuxcp命令复制文件到另一个...
- 使用免费绿色工具chfs,将文件夹共享成网盘
-
需求:业务需求方有个需要将apk包上传到服务器中,通过chfs可以将服务器目录共享出来,可以可以登录后台自行上传apk文件包。本文就教大家三个知识点1.centos7下使用chfs,共享目录。2.使用...
- Mysql和Hive之间通过Sqoop进行数据同步
-
文章回顾理论大数据框架原理简介大数据发展历程及技术选型实践搭建大数据运行环境之一搭建大数据运行环境之二本地MAC环境配置CPU数和内存大小查看CPU数sysctlmachdep.cpu#核数为...
- 真实案例记录Linux被植入rootkit导致服务器带宽跑满的解决过程
-
一、关于linux下的rootkitrootkit是Linux平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到攻击和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工...
- python周期任务调度工具Schedule使用详解
-
如果你想周期性地执行某个Python脚本,最出名的选择应该是Crontab脚本,但是Crontab具有以下缺点:不方便执行秒级任务。当需要执行的定时任务有上百个的时候,Crontab的管...
- Linux 系统日常巡检脚本(shell巡检脚本)
-
Linux系统日常巡检脚本,巡检内容包含了,磁盘,内存cpu进程文件更改用户登录等一系列的操作直接用就行了。报告以邮件发送到邮箱在log下生成巡检报告。#!/bin/bash#@Au...
- Schedule—简单实用的 Python 周期任务调度工具
-
如果你想周期性地执行某个Python脚本,最出名的选择应该是Crontab脚本,但是Crontab具有以下缺点:1.不方便执行秒级任务。2.当需要执行的定时任务有上百个的时候,Cronta...
- celery定时与异步任务详解(定时任务异步执行)
-
celery简介Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。Celery的架构由三部分组成,消息中间件(messagebroke...
- 开源免费的定时任务管理系统:Gocron
-
Gocron:精准调度未来,你的全能定时任务管理工具!-精选真开源,释放新价值。概览Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发,是一个轻量级定时任务集中调度和管理...
- PHP Laravel定时任务Schedule(laravel定时任务原理)
-
前提:本文方法是利用Linux的crontab定时任务来协助实现Laravel调度(Mac也一样)。一、首先添加Crontab定时任务,这里只做简单介绍:用命令crontab-e添加如下内容**...
- Linux的常用命令就是记不住,怎么办?于是推出了这套教程
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- 如何定期执行 Python 脚本:5 种常见方法
-
定期执行任务是自动化工作流程中的重要环节,无论是数据抓取、文件备份,还是定期报告生成,定时运行脚本都可以极大提高效率。本文将介绍五种方法,通过这些方法,你可以轻松设置定期执行Python脚本的任务...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)