海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)

2023-05-16

海思开发板FFmpeg+Nginx推流RTSP播放(优秀教程收集+实操整理)

  • 安装FFmpeg及移植
    • FFmpeg编译问题收录:
      • static declaration of 'cbrt' follows non-static declaration
      • ERROR: srt >= 1.3.0 not found using pkg-config
  • Nginx的安装(windos\Ubuntu):
  • 开始推流
  • 拉流播放

安装FFmpeg及移植

FFmpeg是一款功能强大的集合库,能够编辑视频,能够截取图片,也可生成git图片,简直不要太好用。这里就简单介绍一下这个库的其中一个用的比较多的功能–推流。

我的配置是: 开发板拉取摄像头流,推到winodows的Nginx服务器,然后用Ubuntu 的FFplay进行播放,若你的配置方案和我的不一样,下面也整理了对应完整例程供参考。一起交流学习~


一般而言,对于大部分的linux的库的源码方式安装,都离不开几个步骤:
1.通过官网下载源码/其他途径获取源码
2.解压 tar -zxvf xxx.tar.gz / tar -jxvf xxx.tar.bz2
3.编写简单脚本 main.sh 调用configure (不用命令行慢慢输入,好配置编译选项)
4.编译 make
5.安装 make install(安装进你指定的目录)
6.编译生成文件夹下的/bin放进开发板的/bin 。/lib放进/lib

PS:想指明第三方库所在路径,有四种方法:,
1,在 /etc/ld.so.conf 文件中添加库的搜索路径。将库文件的绝对路径/lib直接写进去就OK。
2,丢到编译器的默认搜索路径。使用 arm-前缀-gcc -print-file-name=xxx.so 来找到默认路径
3,在configure阶段,添加-LDFLAG 增加编译选项给编译器直接增加搜索路径
4,指定搜索路径export LD_LIBRARY_PATH=/yourdir/:$LD_LIBRARY_PATH ,或添加xx.pc文件的路径export PKG_CONFIG_PATH=/xxx:$PKG_CONFIG_PATH 如果你移动了lib库文件,对应的xx.pc(若有)也要同步更新

这个xxx.pc 相当于库的说明文件,声明lib和include文件放在哪个目录。
这样pkg-config命令才能找到这些依赖库。
(比如你已经把语句--with--xxx=DIR 添加进sh脚本,但是configure总是说找不到,
就export PKG_CONFIG_PATH=.....$PKG_CONFIG_PATH 把那个依赖库的/lib/pkgconfig/xxx.pc 文件路径添加进去)

步骤2里还是不行的话分两种情况处理:
【如果没有生成Makefile】,就把对应库文件INCLUDE 和lib,放到你gcc编译器使用的lib目录。
交叉编译器的lib目录可能要费点心思,根据常用库看看在哪里,如线程库find ./ -name "libpthread*"。
普通的桌面gcc目录就去/usr/include
【生成了Makefile就好办】,直接根据提示的错误找到Makefile文件的对应行,在对应语句后面增加搜索路径 -L/xx/xxx/lib -lxx(库名字)

1.通过官网下载源码/其他途径获取源码
xvid、x264、ffmpeg源码下载及编译
官方的ffmpeg源码下载z
FFmpeg的configure 配置选项的翻译(根据需要编译)
我的ffmpeg移植到开发板,这里附上我的FFmpeg配置脚本,供大家参考:

#!/bin/bash   
./configure \
	--prefix=/home/ouser/temp/ffmpeg_hisix200/ \   # 存放位置
	--disable-debug  \
	--disable-avdevice \
	--enable-encoders \
	--enable-ffmpeg \
	--enable-gpl \
	--enable-small \
	--target-os=linux \
	--arch=arm \                              # 目标为arm平台
	--enable-nonfree \
	--enable-cross-compile \
	--cross-prefix=arm-himix200-linux- \      #定义编译工具前缀
	--enable-encoder=libx264 \
	--enable-libx264 \  #表示引入x264库,下面两句是指明x264路径,还需在profile内添加语句
	--extra-cflags=-I/home/ouser/temp/x264/include \   
	--extra-ldflags=-L/home/ouser/temp/x264/lib \ 
	--enable-static \               # 编译为静态库(把库整合编译进/bin下可执行文件,10MB左右,)
	--cc=arm-himix200-linux-gcc \   # 再次定义交叉工具链为海思提供的工具链

附上我x264解码库的配置脚本(如果ffmpeg选择需要x264库,就需要在下面的开发板/etc/profile文件里添加它的编译后的lib库,否则会报错找不到库):

#!/bin/bash
./configure \
--prefix=/home/ouser/temp/x264 \
--host=arm-himix200-linux \
--cross-prefix=arm-himix200-linux- \
--enable-shared \
--disable-asm





编译完FFmpeg及想要的编解码库之后,安装就非常简单了:
1,找到你指定的安装目录,
2,把bin目录下的文件丢去/usr/bin 
3,把lib目录下的文件丢去/usr/lib,
这样就完成了。但是如果像我一样根目录(/ )下空间不足,无奈只能放在其他挂载在大分区下的文件系统的情况,就需要在开发板的 /etc/profile 处加下面两句让系统找得到可执行文件和链接库 【$后的语句类似int a= 0 的 a,是变量描述符】:

```bash
export LD_LIBRARY_PATH=[你放的目录]:$LD_LIBRARY_PATH
export PATH=[你放的目录]:$PATH

最后附上FFmpeg官方文档
官方英文文档 - 最全文档,但全英文
GitHub中文档 - 东西比较少,但好歹看得懂

FFmpeg编译问题收录:

static declaration of ‘cbrt’ follows non-static declaration

有些版本的ffmpeg会有些奇怪的问题,就比如下图:
在这里插入图片描述
查看出问题的libm.c就知道了,是没有声明该函数。这并不是源码错误,而是./config.h里面设置出错了,在./config.h找到对应的项目的宏定义,改为1开启它即可。
在这里插入图片描述

ERROR: srt >= 1.3.0 not found using pkg-config

这种情况一般是libsrt没有安装到位,编译器找不到它。一种是libsrt编译中找不到依赖库。具体情况具体分析,根据提示,可以查看./ffbuild/config.log找到原因。
在这里插入图片描述
我遇到的问题是srt依赖库libgcc_s.so libstdc++.so无法找到。这两个库的关系可以点这里看,而我的编译工具是交叉编译工具,默认库搜索路径比较复杂,所以通过arm-himix200-gcc -print-file-name=libstdc++.so找到了库实际所在目录。找到文件就好办,链接它呗!

想让编译器搜索到指定库,可以通过
①编译脚本添加$LD_LIBRARY_PATH
②编译脚本添加--extra-cflags=-L/xx/ --extra-ldflags=-L指定搜索路径。
③最终大招在已有搜索路径下建立软连接
很幸运我前两个方法还是失败,查看./ffbuild/config.log发现总是有部分文件在编译时无法链接到srt依赖库libgcc_s.so libstdc++.so
在这里插入图片描述

--extra-ldflags=-rpath的解释

最后通过第三招在默认搜索路径增加软连接成功通过configure阶段。软连接添加命令ln -s /源文件 ./要生成的目标文件

遇到过一种比较坑爹的情况,就是ffmpeg链接库的时候会调用pkg-config工具,但我这个linux版本居然没有这个工具,于是参考文章步骤安装了pkg-coinfig。pkg-config源码下载

在这里插入图片描述

其余问题集锦


Nginx的安装(windos\Ubuntu):

Nginx在Ubuntu下的安装

Nginx在Windows下的安装并配置rtmp模块


我的Nginx是放在windows的,windows下安装完成后,在conf/nginx.conf 文件添加RTMP直播支持
这样推流的rtmp服务器地址是 rtmp://your_ip:1935/live/test1

rtmp_auto_push on;
rtmp {
    server {
        listen 1935;

        application live {
            live on;
        }
		
		application history {
            live on;
        }
		
        application hls {
            live on;
            hls on;  
            hls_path temp/hls;  
            hls_fragment 8s;  
        }
    }
}
#这样推流的rtmp服务器地址是 rtmp://your_ip:1935/live/test1

完事了在Nginx目录shift+右键命令行,输入:

nginx.exe -c conf\xxx.conf //执行rtmp配置文件,不同版本配置文件名不一样,要注意,你上面修改了哪个,就执行哪个配置文件。

注意:此时命令行会一直处于执行中 不用理会。

开始推流

到这一步,确定你的Nginx服务器已经搭建好,FFmpeg也移植好后,就执行这条命令
这里我测试的是Nginx搭建在Windows下,开发板循环推流一个mp4文件到windos的Nginx服务器:

//开发板端:
ffmpeg -re -stream_loop -1 -i 123test.mp4 -c:av copy -f flv rtmp://192.168.0.100:1935/live
[-stream_loop -1]: 表示无限循环播放该视频
[rtmp://192.168.0.100:1935/live]: ip:端口号/live代表是直播

//测试保留-----把rtsp获取的视频流推流到rtmp服务器
ffmpeg -re -i rtsp://username:password@ip:port/xxxxxxx -vcodec copy -acodec copy -f flv -y rtmp://ip:port/live/test

附上其他博主的详细教程
Nginx在windos下的参考文章
Nginx在Ubuntu下的参考文章

拉流播放

这个就简单了,桌面Ubuntu:

ffplay rtmp://192.168.0.100:1935/live

桌面windos: 就直接使用VLC,然后媒体选择网络串流,输入URL即可。VLC播放器百度一下即可找到下载链接

6666


最后感谢上面所有被我引用了文章的博主!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理) 的相关文章

  • pandas处理较大数据量级的方法 - chunk,hdf,pkl

    前情提要 工作原因需要处理一批约30G左右的CSV数据 xff0c 数据量级不需要hadoop的使用 xff0c 同时由于办公的本本内存较低的缘故 xff0c 需要解读取数据时内存不足的原因 操作流程 xff1a 方法与方式 首先是读取数据
  • Objective-C --- UIView (基础运用)

    为什么80 的码农都做不了架构师 xff1f gt gt gt 1 创建 UIView view 61 UIView alloc init 2 位置 frame view frame 相对父视图的位置 view bounds 相对自己的位置
  • Debian8.2 xfce桌面设置双屏

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近想折腾 Xfce xff0c 而且 Fedora 的包都好老啊 xff0c 所以换了 Arch Linux 果然装完就有的折腾了 xff1a Xfce 4 0 居然不支
  • 【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例

    1 常用接口 个人比较喜欢sqlite 使用最方便 xff0c 唯一的准备工作是下载250K的源 xff1b 而且作者很热心 xff0c 有问必答 以下演示一下使用sqlite的步骤 xff0c 先创建一个数据库 xff0c 然后查询其中的
  • Qt实现MFC的WM_IDLE机制.doc

    win32 有一个消息是 WM IDLE 而在MFC里面的也有 一个virtualBOOLOnIdle LONGlCount 的函数与之相对应 xff0c 而在MSDN中对该函数的解释是 xff1a Override this member
  • ERROR: Kernel configuration is invalid.

    最简单的linux hello的驱动源程序 span class hljs comment 下面是驱动源代码 span span class hljs preprocessor include lt linux init h gt span
  • i2c中start和restart的区别

    有的硬件芯片提供了一个个寄存器 xff0c 供我们很好的操作i2c xff0c 但是 xff0c 在用的时候 xff0c 我们是不知道他到地是怎么操作的 xff0c 下边 xff0c 我就探讨下i2c中的start和restart的区别 s
  • Linux——常见的N个问题

    一 如何建立多用户 提醒大家一句 xff0c 别一直使用root用户 xff0c 因为root用户在系统中有着至高无上的权力 xff0c 一不小心 就可能破坏系统 比如我们想删除 temp目录下的文件却将命令不小心输成 rm temp xf
  • animate css组合,Vue---CSS动画之animate.css库

    animation完成一个动画效果 代码基本结构搭建 使用与过渡动画相同的代码结构 hello world change var vm 61 new Vue el 39 root 39 data show true methods hand
  • P1661 扩散

    P1661 扩散 题目描述 一个点每过一个单位时间就会向四个方向扩散一个距离 xff0c 如图 两个点a b连通 xff0c 记作e a b 当且仅当a b的扩散区域有公共部分 连通块的定义是块内的任意两个点u v都必定存在路径e u a0
  • java 返回两个list_Java 获取两个List的交集和差集,以及应用场景操作

    背景介绍 在实际项目中 xff0c 特别是一些管理后台类的项目 xff0c 会遇到底层数据是按照一对多关系的数据表存储的管理界面 列表页是一对多关系中一对应的数据列表 xff0c 二级的详情页中是一对多关系中多对应的多条数据展示 通常二级页
  • 微服务注册中心注册表与hashcode实现golang版

    背景 基于负载均衡的服务调用 基于负载均衡的服务相互调用指的是通过基于Lvs Haproxy Nginx等负载均衡软件来构建一个负载均衡服务 xff0c 所有的服务调用都通过负载均衡器 从负载均衡的这种模式下其实有两个主要的问题 xff1a
  • cookie txt format

    2019独角兽企业重金招聘Python工程师标准 gt gt gt cookies txt Tab separated columns are Domain Only Sent To Creator Path Secure Expires
  • linux环境变量设置 profile,Linux 环境变量 设置 etc profile

    一 Linux的变量种类 按变量的生存周期来划分 xff0c Linux变量可分为两类 xff1a 1 永久的 xff1a 需要修改配置文件 xff0c 变量永久生效 2 临时的 xff1a 使用export命令声明即可 xff0c 变量在
  • Debian 7 桌面美化

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 安装中文字体 1 文泉驿 查找 xff1a apt cache search wqy 可能输出如下信息 xff1a ttf wqy microhei A droid d
  • mysql编程展示数据_Mysql的列修改成行并显示数据的简单实现

    创建测试表 xff1a DROP TABLE IF EXISTS 96 test 96 CREATE TABLE 96 test 96 96 year 96 int 11 DEFAULT NULL 96 month 96 int 11 DE
  • LINUX:window下使用debian安装虚拟环境

    windows系统下 xff0c 使用debian做开发 xff0c 使用的是python编程语言 首先 xff0c 要安装pip 安装命令 xff1a apt install python3 pip 如果使用这个命令后出现如下错误提示 x
  • 如何“优雅地”进行Jetson nano 学习

    RT 其实就是面对多场景应用时 xff0c nano不可能待在同一个地方 xff0c 要么在车上 xff0c 在机器人上 我们扛着一 个大显示器到处跑肯定是不太现实的 xff0c 当然 xff0c 如果想要锻炼身体的同学另说 xff01 改
  • xmake入门,构建项目原来可以如此简单

    前言 在开发xmake之前 xff0c 我一直在使用gnumake makefile来维护个人C C 43 43 项目 xff0c 一开始还好 xff0c 然而等项目越来越庞大后 xff0c 维护起来就非常吃力了 xff0c 后续也用过一阵
  • haproxy负载均衡

    os xff1a root 64 node1 cat etc system release CentOS release 6 4 Final 参考文章 xff1a http www serverlab ca tutorials linux

随机推荐

  • 无线网络wifi (WPA/WPA2)密码破解方法

    无线网络password破解WPA WPA2教程 本教程用于探索无线路由安全漏洞 xff0c 禁止用于非法用途 xff0c 违者法律必究 xff08 与我无关 xff09 在动手破解WPA WPA2前 xff0c 应该先了解一下基础知识 x
  • 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。...

    环境 xff1a 景安快云服务器 xff08 听说很垃圾 xff0c 但是公司买的 xff0c 我也刚来 xff09 xff0c CentOS 6 8 x86 64 xff0c Apache xff0c MySQL5 1 xff0c PHP
  • 【遥感专题系列】微波遥感(三、SAR图像特征)

    SAR是主动式侧视雷达系统 xff0c 且成像几何属于斜距投影类型 因此SAR图像与光学图像在成像机理 几何特征 辐射特征等方面都有较大的区别 在进行SAR图像处理和应用前 xff0c 需要了解SAR图像的基本特征 本文主要包括 xff1a
  • Python可以用来做什么?这4个在平常生活中都可以用到

    Python是一个非常好用的程序语言 xff0c 开发的速度非常快 xff0c 你都知道Python可以用来做什么吗 xff1f 下面我将介绍几个简单的小程序 xff0c 你也可以试一试 xff01 1 网易云音乐批量下载 你可以利用Pyt
  • Next.js脚手架进阶 — 完美契合ant-design

    前言 上次入门完了之后感觉意犹未尽 xff0c 总觉得这个脚手架还是不太完美 xff0c 还有可以改进的地方 xff0c 所以为了与人方便也是与己方便 xff0c 就继续写几篇吧 xff5e xff0c 不过既然之前的叫做入门系列 xff0
  • Python实现“淘宝自动发货机器人”

    背景 之前看到朋友下载csdn资源 xff0c 但因为没有下载积分 xff0c 因此他会在淘宝上购买一个叫做 csdn资源代下 的业务 对我来说 xff0c 也许这是一个商机 xff08 因为刚好提交了一个csdn漏洞 xff0c 得到了一
  • Javascript定时器那些事儿

    一 什么是定时器 JS提供了一些原生方法来实现延时去执行某一段代码 xff0c 下面来简单介绍一下 setTimeout 设置一个定时器 xff0c 在定时器到期后执行一次函数或代码段 var timeoutId 61 window set
  • new Date() 方法到底是获取什么时间

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 问题 java 中 xff0c new Date 方法 获取的时间 xff0c 究竟与当前的系统时间有什么关联 xff1f 简单的时刻对应关系吗 xff1f 2 测试环
  • Windows使用

    将压缩包安装的软件放入开始菜单 平台需求配置 平台 本文针对windows平台 xff0c 在win11上进行过测试 xff0c 其他平台请自行确认是否可用 需求 最近在安装软件时 xff0c 发现了一个问题 很多软件直接给一个压缩包 xf
  • Python装饰器高级版—Python类内定义装饰器并传递self参数

    本文重点 xff1a 解决了类里面定义的装饰器 xff0c 在同一个类里面使用的问题 xff0c 并实现了装饰器的类属性参数传递 目录 xff1a 一 基本装饰器 二 在类里定义装饰器 xff0c 装饰本类内函数 三 类装饰器 正文 xff
  • 华为交换机链路聚合命令

    配置链路聚合 1 创建聚合组 sys interface eth trunk 2 2 配置聚合模式为手工模式 interface eth trunk 2 mode manual load balance 表示手工模式 mode lacp l
  • VC EXE程序删除自身

    在开发程序过程中 xff0c 有许多情况中都需要执行程序自己把自己从物理磁盘上删除 xff0c 例如 xff0c 卸装程序 xff0c 一些黑客程序获取信息后自清除等 xff0c 我们把这些具有自删除功能的程序统称为 自杀 程序 对于一名程
  • 理解WinRT

    WinRT Windows Runtime 是微软新一代在Win8 Metro下开发框架 xff0c 它是一套面向对象 跨语言并且是Native的库 如果有人问我WinRT的核心技术是什么 xff1f 我的答案是 COM 43 Net Me
  • vim 基本使用

    vim 下基本命令 重新加载 vimrc source vimrc 列出当前缓冲区的所有文档 ls 然后使用 b 43 编号 移至该文档 选中多行 v 43 shift 然后 j k 上下移动 缩进单行 gt gt lt lt 当前行到结尾
  • hashcode()和equals()的作用、区别、联系

    介绍一 hashCode 方法和equal 方法的作用其实一样 xff0c 在Java里都是用来对比两个对象是否相等一致 xff0c 那么equal 既然已经能实现对比的功能了 xff0c 为什么还要hashCode 呢 xff1f 因为重
  • c语言文件中存入/读取double型矩阵型数据

    test c Created on Jun 1 2019 Author lgh include lt stdio h gt include lt stdlib h gt double allocation memory double int
  • windows自动更新变成了灰色,不能选择的原因

    现象 发现我的电脑 属性 自动更新里面所有的按钮都已经是灰色的了 xff0c 而且每次开机都会自动运行自动更新 xff0c 关闭进程也无法停止 xff0c 几秒钟后又会开始更新 xff0c 而且更新后会要求重新启动 控制面板里的安全中心显示
  • 在 Debian Stretch 上安装 FFmpeg

    FFmpeg 是一款流行的多媒体框架 xff0c 可以用来记录 转换数字音频 视频 xff0c 并能将其转化为流的开源计算机程序 采用LGPL或GPL许可证 它提供了录制 转换以及流化音视频的完整解决方案 它包含了非常先进的音频 视频编解码
  • MHA使用手册一:概述(基于0.56版本)

    本文基于MHA官方文档0 56版wiki翻译而成 原文链接 xff1a https github com yoshinorim mha4mysql manager wiki 概述 概述 MHA以最少的停机时间 xff08 通常在10 30秒
  • 海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)

    海思开发板FFmpeg 43 Nginx推流RTSP播放 xff08 优秀教程收集 43 实操整理 xff09 安装FFmpeg及移植FFmpeg编译问题收录 xff1a static declaration of 39 cbrt 39 f