FFmpeg推流

目录

一. 环境准备 

二. 安装FFmpeg

三. 给docker主机安装docker服务

四. 使用 FFmpeg 进行推流测试


FFmpeg是一个非常强大的多媒体处理工具,它可以用于视频和音频的录制、转换以及流处理。在流处理方面,FFmpeg可以用来推流,即将本地媒体文件或者实时数据推送到流媒体服务器上。

一. 环境准备 

关闭防火墙和selinux,进行时间同步。

主机名IP系统软件版本配置信息
ffmpeg192.168.226.31Rocky_linux9.4

FFmpeg-n5.0.1

nasm-2.16.03

2核4G
galera2192.168.226.32Rocky_linux9.4mysql-wsrep-8.0

galera-26.4.14-1

2核4G

FFmpeg下载地址:https://github.com/FFmpeg/FFmpeg/tags

nasm下载地址nasm-2.16.03.tar.gz:Index of /pub/nasm/releasebuilds/2.16.03

二. 安装FFmpeg

下载并上传压缩包,这里我已经传好了。

[root@ffmpeg ~]# ll
total 15748
-rw-r--r--  1 root root 14428012 Aug  5 17:48 FFmpeg-n5.1.6.tar.gz
-rw-------. 1 root root      815 Jun  6 14:00 anaconda-ks.cfg
-rw-r--r--  1 root root  1688160 Aug  5 19:40 nasm-2.16.03.tar.gz

 首先安装编译 FFmpeg 所需的依赖项:

[root@ffmpeg ~]# yum install -y epel-release
[root@ffmpeg ~]# yum install -y autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel

安装 NASM

NASM 是一个汇编器,FFmpeg 需要它来编译

[root@ffmpeg ~]# tar -xf nasm-2.16.03.tar.gz
[root@ffmpeg ~]# cd nasm-2.16.03
[root@ffmpeg nasm-2.16.03]# ./configure
[root@ffmpeg nasm-2.16.03]# make && make install
[root@ffmpeg nasm-2.16.03]# nasm -v
NASM version 2.16.03 compiled on Aug  5 2024

安装x264

[root@ffmpeg ~]# git clone https://code.videolan.org/videolan/x264.git
[root@ffmpeg ~]# cd x264/#--enable-static 使得构建过程中生成静态库。
#--enable-shared 使得构建过程中生成共享库。
[root@ffmpeg x264]# ./configure --enable-static --enable-shared
[root@ffmpeg x264]# make && make install && cd ~
[root@ffmpeg ~]# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
[root@ffmpeg ~]# pkg-config --cflags --libs x264

获取 FFmpeg 源代码

[root@ffmpeg ~]# tar -xf FFmpeg-n5.1.6.tar.gz
[root@ffmpeg ~]# cd FFmpeg-n5.1.6
[root@ffmpeg FFmpeg-n5.1.6]# ./configure --enable-shared --enable-libx264 --enable-gpl --prefix=/usr/local/ffmpeg --extra-cflags="-fPIC"
[root@ffmpeg FFmpeg-n5.1.6]# make && make install 
[root@ffmpeg FFmpeg-n5.1.6]# echo $LD_LIBRARY_PATH
[root@ffmpeg FFmpeg-n5.1.6]# ls -l /usr/local/ffmpeg/lib/libavdevice.so.59
[root@ffmpeg FFmpeg-n5.1.6]# ls -l /usr/local/ffmpeg/lib/libavdevice.so.59.7.100
[root@ffmpeg FFmpeg-n5.1.6]# export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
[root@ffmpeg ~]# export PATH=/usr/local/ffmpeg/bin:$PATH
[root@ffmpeg ~]# source ~/.bashrc[root@ffmpeg ~]# ffmpeg -version
ffmpeg version 5.1.6 Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 11 (GCC)
configuration: --enable-shared --enable-libx264 --enable-gpl --prefix=/usr/local/ffmpeg --extra-cflags=-fPIC
libavutil      57. 28.100 / 57. 28.100
libavcodec     59. 37.100 / 59. 37.100
libavformat    59. 27.100 / 59. 27.100
libavdevice    59.  7.100 / 59.  7.100
libavfilter     8. 44.100 /  8. 44.100
libswscale      6.  7.100 /  6.  7.100
libswresample   4.  7.100 /  4.  7.100
libpostproc    56.  6.100 / 56.  6.100

三. 给docker主机安装docker服务

安装 

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

配置加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.rainbond.cc"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

拉取nginx镜像

tiangolo/nginx-rtmp 是一个 Docker 镜像,用于提供 Nginx 和 RTMP(Real-Time Messaging Protocol)服务器的功能。这个镜像由 Tiangolo 维护,主要用于视频流媒体的处理和转发。

[root@docker ~]# docker pull tiangolo/nginx-rtmp:latest

 创建nginx配置文件

[root@docker ~]# vim nginx.conf
worker_processes auto;  # 自动根据可用的 CPU 核心数量设置 worker 进程数
rtmp_auto_push on;events {worker_connections 1024;  # 增加 worker 可以处理的连接数
}http {sendfile on;              # 启用高效文件传输tcp_nopush on;            # 发送响应时优化 TCP 包tcp_nodelay on;           # 减少网络延迟keepalive_timeout 5 5;    # 长连接超时设置client_body_buffer_size 128k;  # 客户端请求体缓冲区大小client_max_body_size 10m;      # 允许客户端请求的最大单文件字节数client_body_timeout 10;        # 客户端请求体超时client_header_timeout 10;      # 客户端请求头超时send_timeout 10;               # 响应发送超时server {listen 8080;  # 监听 8080 端口# HLS 配置location /hls {types {application/vnd.apple.mpegurl m3u8;  # 设置 MIME 类型}root /mnt/;  # HLS 文件根目录add_header Cache-Control no-cache;  # 禁用缓存add_header Access-Control-Allow-Origin *;  # 跨域支持}}
}rtmp {server {listen 1935;           # 监听 1935 端口,用于 RTMP 流listen [::]:1935 ipv6only=on;  # 同时支持 IPv6application live {live on;  # 启用直播record off;  # 关闭录制# HLS 配置hls on;  # 启用 HLShls_path /mnt/hls/;  # HLS 文件存储路径hls_fragment 3s;  # HLS 片段长度hls_playlist_length 30s;  # HLS 播放列表长度}}
}

运行并查看端口

[root@docker ~]# docker run -d -p 1935:1935 -p 8080:8080 -v ./nginx.conf:/etc/nginx/nginx.conf --name nginx-rtmp tiangolo/nginx-rtmp[root@docker ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
2c8eb664354a   tiangolo/nginx-rtmp   "nginx -g 'daemon of…"   18 seconds ago   Up 17 seconds   0.0.0.0:1935->1935/tcp, :::1935->1935/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   nginx-rtmp[root@docker ~]# ss -tnlp
State               Recv-Q              Send-Q                           Local Address:Port                           Peer Address:Port             Process                                              
LISTEN              0                   128                                    0.0.0.0:22                                  0.0.0.0:*                 users:(("sshd",pid=832,fd=3))                       
LISTEN              0                   4096                                   0.0.0.0:1935                                0.0.0.0:*                 users:(("docker-proxy",pid=16089,fd=4))             
LISTEN              0                   4096                                   0.0.0.0:8080                                0.0.0.0:*                 users:(("docker-proxy",pid=16104,fd=4))             
LISTEN              0                   128                                       [::]:22                                     [::]:*                 users:(("sshd",pid=832,fd=4))                       
LISTEN              0                   4096                                      [::]:1935                                   [::]:*                 users:(("docker-proxy",pid=16094,fd=4))             
LISTEN              0                   4096                                      [::]:8080                                   [::]:*                 users:(("docker-proxy",pid=16127,fd=4))  

  

四. 使用 FFmpeg 进行推流测试

准备一个视频文件、摄像头输入或其他任何 FFmpeg 支持的媒体源。

例如我在这个网站下载一个MP4的格式视频,大约五分钟的大小。

哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

https://www.kedou.life/

 上传到ffmpeg主机,视频名为shipin.mp4

[root@ffmpeg ~]# ll
total 76580
drwxrwxr-x  17 root root     4096 Aug  5 20:43 FFmpeg-n5.1.6
-rw-r--r--   1 root root 14428012 Aug  5 17:48 FFmpeg-n5.1.6.tar.gz
-rw-------.  1 root root      815 Jun  6 14:00 anaconda-ks.cfg
drwxrwsr-x  24  802  900     4096 Aug  5 19:43 nasm-2.16.03
-rw-r--r--   1 root root  1688160 Aug  5 19:40 nasm-2.16.03.tar.gz
-rw-r--r--   1 root root 62278099 Aug  5 21:00 shipin.mp4
drwxr-xr-x  11 root root     4096 Aug  5 20:31 x264

 推流测试

[root@ffmpeg ~]# ffmpeg -re -i shipin.mp4 -c:v libx264 -preset ultrafast -maxrate 1500k -bufsize 3000k -pix_fmt yuv420p -g 50 -s 1280x720 -c:a aac -b:a 128k -ar 44100 -f flv rtmp://192.168.226.32:1935/live/stream

这个时候,切换到docker容器里查看

[root@docker ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
2c8eb664354a   tiangolo/nginx-rtmp   "nginx -g 'daemon of…"   12 minutes ago   Up 12 minutes   0.0.0.0:1935->1935/tcp, :::1935->1935/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   nginx-rtmp[root@docker ~]# docker exec -it nginx-rtmp /bin/bash
root@2c8eb664354a:/# cd /mnt/hls/  root@2c8eb664354a:/mnt/hls# ls
stream-0.ts  stream-1.ts  stream-2.ts  stream-26.ts  stream-27.ts  stream-28.ts  stream-29.ts  stream.m3u8

然后桌面新建一个.html结尾的文件,注意代码里你需要修改的是对应的IP地址

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>HLS Stream with Video.js</title><link href="https://vjs.zencdn.net/7.14.3/video-js.css" rel="stylesheet" /><style>/* 自定义 Video.js 播放器样式 */.vjs-default-skin {font-family: "Arial", sans-serif;font-size: 16px;color: #FFF;background-color: #333;border: 2px solid #555;border-radius: 10px;overflow: hidden;}.vjs-control-bar {background: rgba(0, 0, 0, 0.7);}.vjs-big-play-button {background: rgba(255, 255, 255, 0.3);border: none;border-radius: 50%;}.vjs-progress-holder {background: rgba(255, 255, 255, 0.2);}.vjs-play-progress {background: #FFCC00; /* 进度条前景色 */}.vjs-load-progress {background: #666; /* 加载进度条色 */}.vjs-seek-to-live-control {display: none;}.video-js {width: 720px;  /* 固定宽度 */height: 405px; /* 固定高度,宽高比为16:9 */margin: 0 auto;  /* 水平居中 */box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);display: block;  /* 确保播放器为块级元素 */}body {background-color: #333;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;}</style>
</head>
<body><video id="my-video" class="video-js vjs-default-skin" controls preload="auto"data-setup='{"fluid": false}'>// 修改此处的IP为你的IP即可<source src="http://192.168.226.32:8080/hls/stream.m3u8" type="application/x-mpegURL"></video><script src="https://vjs.zencdn.net/7.14.3/video.min.js"></script><script>var player = videojs('my-video', {controls: true,autoplay: false,preload: 'auto'});// 示例: 监听播放进度事件player.on('timeupdate', function() {var currentTime = player.currentTime();var duration = player.duration();console.log('当前播放时间:', currentTime, '总时长:', duration);});</script>
</body>
</html>

在推流的同时,打开网页播放即可

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

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

相关文章

【第17章】Spring Cloud之Gateway服务调用

文章目录 前言一、用户服务二、网关服务1. 负载均衡2. 服务调用3. 登录拦截器 三、单元测试1. 启动服务2. 用户不存在3. 正常登录 总结 前言 在上一章我们使用JWT简单完成了用户认证&#xff0c;【第16章】Spring Cloud之Gateway全局过滤器(安全认证)&#xff0c;上一章内容已…

端点区间影响

前言&#xff1a;这一题本来想就是直接来一个前缀和来写&#xff0c;直接左边加一&#xff0c;右边减一&#xff0c;但是细想好像有问题&#xff0c;我们平时做的题目左边端点造成的影响会对这一段区间造成影响&#xff0c;但是这一题的话超过了左边端点就不会有影响了 那这一题…

vue3-ts:husky + prettier / 代码格式化工具

一、Prettier简介 Prettier是一个流行的代码格式化工具&#xff0c;它的主要作用是帮助开发者自动规范化代码的格式&#xff0c;提高代码的可读性和一致性。Prettier通过解析代码并使用自己的规则重新打印它&#xff0c;以确保代码风格的一致性和符合预设的格式化标准。 二、…

WPF学习(8)- Button按钮

1. 用法解析 Button因为继承了ButtonBase&#xff0c;而ButtonBase又继承了ContentControl&#xff0c;所以&#xff0c;Button可以通过设置Content属性来设置要显示的内容。例如 <Button Content"确定"/>我们使用Button的时机&#xff0c;通常是鼠标点击事件…

【Dash】使用 dash_mantine_components 创建图表

一、Styling Your App The examples in the previous section used Dash HTML Components to build a simple app layout, but you can style your app to look more professional. This section will give a brief overview of the multiple tools that you can use to enhan…

树莓派5进行YOLOv8部署的4种不同部署方式检测速度对比:pytorch、onnx、ncnn、tflite

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Python 异步编程:Asyncio 实现原理

常见的并发模型 多进程/多线程异步ActorPub/Sub Python 异步的基石&#xff1a;协程 协程简介 概念&#xff1a;协作式多任务的子程序&#xff0c;用户态线程或微线程&#xff08;Coroutine&#xff09;。 特点&#xff1a;子程序执行可以中断&#xff0c;恢复后不会丢失之…

生物反应器对Organoids培养有啥帮助?有几种?快来看看!

Bioreactor Technologies for Enhanced Organoid Culture是《INTERNATIONAL JOURNAL OF MOLECULAR SCIENCES》上的一篇文章&#xff0c;介绍了用于类器官培养的生物反应器&#xff0c;包括搅拌式、微流体、旋转壁容器和电刺激四类。搅拌式生物反应器通过改善氧合和实现适当的谱…

【iOS多线程(二)】GCD其他方法详解

GCD其他方法 dispatch_semaphore &#xff08;信号量&#xff09;什么是dispatch_semaphore(信号量)?dispatch_semaphore主要的三个方法dispatch_semaphore主要作用线程安全线程同步 dispatch_afterdispatch_time_t 两种形式 GCD 一次性代码&#xff08;只执行一次&#xff09…

面向 RAG 应用开发者的实用指南和建议

向量搜索并非轻而易举&#xff01; 向量搜索&#xff0c;也称为向量相似性搜索或最近邻搜索&#xff0c;是一种常见于 RAG 应用和信息检索系统中的数据检索技术&#xff0c;用于查找与给定查询向量相似或密切相关的数据。业内通常会宣传该技术在处理大型数据集时非常直观且简单…

【C语言】C语言期末突击/考研--结构体与C++引用

一、结构体--结构体对齐--结构体数组 1.1.结构体的定义、初始化、结构体数组 有时候需要将不同类型的数据组合为一一个整体&#xff0c;以便于引用。 例如&#xff0c;一名学生有学号、姓 名、性别、年龄、地址等属性&#xff0c;如果针对学生的学号、姓名、年龄等都单独定义一…

【MYSQL】表操作

目录 查看当前数据库含有表查看表结构创建表插入&#xff08;新增create&#xff09;查询&#xff08;retrieve&#xff09;全列查询指定列查询查询列是表达式别名查询(as)去重查询(distinct)排序查询(order by)条件查询(where)比较/逻辑运算符使用 分页查询(limit) 一条语句各…

【若依项目-RuoYi】掌握若依前端的基本流程

搞毕设项目&#xff0c;使用前后端分离技术&#xff0c;后端springBoot&#xff0c;前端vue3element plus。自己已经写好前端与后端代码&#xff0c;但想换一个前端界面所以使用到了若依&#xff0c;前前后后遇到许多坑&#xff0c;记录一下&#xff0c;方便之后能够快速回忆。…

尚硅谷谷粒商城项目笔记——八、安装node.js【电脑CPU:AMD】

八、安装node.js 注&#xff1a; [!NOTE] 查看本机系统 官网选择node.js版本 1傻瓜式安装&#xff0c;注意选择路径 图一 图二 至此&#xff0c;nodejs安装完成&#xff01; 2环境配置 找到安装nodejs的路径新增 node_global 和node_cache文件夹 创建完两个空文件夹&#x…

如何快速入门 PyTorch ?

PyTorch是一个机器学习框架&#xff0c;主要依靠深度神经网络&#xff0c;目前已迅速成为机器学习领域中最可靠的框架之一。 PyTorch 的大部分基础代码源于 Ronan Collobert 等人 在 2007 年发起的 Torch7 项目&#xff0c;该项目源于 Yann LeCun 和 Leon Bottou 首创的编程语…

0207、创建场景状态的三个子类

VS使用的是3.5框架&#xff0c;会自带Linq这一行&#xff0c;Unity不支持&#xff0c;需要删除 一、创建三个场景 二、创建三个子类

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用 ​ 有了前面几篇文章的铺垫&#xff0c;现在已经可以实现我到手测试那一步的 1.解读usb_websocket_display.launch.py ​ 首先进入这个目录/root/dev_ws/src/origincar/originca…

Java语言程序设计——篇十二

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

ChatGPT能代替网络作家吗?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 当然可以&#xff01;只要你玩写作AI玩得6&#xff0c;甚至可以达到某些大神的水平&#xff01; 看看大神、小白、AI输出内容的区…