海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)
海思开发板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进行播放,若你的配置方案和我的不一样,下面也整理了对应完整例程供参考。一起交流学习~
一般而言,对于大部分的Ubuntu的库的源码方式安装,都离不开几个步骤
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
(如果有些依赖库--with--xxx=DIR 你已经添加进sh脚本,但是configure总是说找不到,
就export PKG_CONFIG_PATH=.....$PKG_CONFIG_PATH 把那个依赖库输出路径
的/lib/pkgconfig/xxx.pc 文件路径添加进去
这个xxx.pc 相当于库的说明文件,
声明lib和include文件放在哪个目录,这样pkg-config命令才能找到这些依赖库。当然,如果库移动了,xxx.pc也要更改)如果还是不行(应该是交叉编译的ld工具查找不到对应库),
这个时候就只能在配置脚本xxx.sh里的./configure里面增加一行 LDFLAGS=-L<dir>
意思是在调用编译的时候直接指定包含的库的路径还是不行的话分两种情况:
如果没有生成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
PS:想指明第三方库所在路径,有四种方法:,
1,添加xx.pc文件export PKG_CONFIG_PATH=/xxx:$PKG_CONFIG_PATH
和指定搜索路径的export LD_LIBRARY_PATH=/yourdir/:$LD_LIBRARY_PATH
2,在 /etc/ld.so.conf 文件中添加库的搜索路径。将库文件的绝对路径/lib直接写进去就OK。
3,丢到编译器的默认搜索路径。使用arm-前缀-gcc -print-file-name=xxx.so
来找到默认路径
4,在configure阶段,添加-LDFLAG
增加编译选项给编译器直接增加搜索路径
如果你移动了lib库文件,对应的xx.pc也要同步更新,且放到pkgconfig搜索目录下!!否则pkg-config会搜索不到!
编译完FFmpeg及想要的编解码库之后,安装就非常简单了:
1,找到你指定的安装目录,
2,把bin目录下的文件丢去/usr/bin
3,把lib目录下的文件丢去/usr/lib,
这样就完成了。但是如果像我一样根目录(/ )下空间不足,无奈只能放在其他挂载在大分区下的文件系统的情况,就需要在开发板的 /etc/profile 处加下面两句让系统找得到可执行文件和链接库 【$后的语句类似int a= 0 的 a,是变量描述符】:
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播放器百度一下即可找到下载链接
最后感谢上面所有被我引用了文章的博主!
海思开发板FFmpeg+Nginx,推流RTMP播放(优秀教程收集+实操整理)相关推荐
- 【华为出品】物联网全栈开发实战营第2期来啦!送海思开发板
物联网一直在改变我们生活的方方面面.可穿戴设备有助于监控我们的偏好.习惯和健康状况.智能家居设备可提高家居的舒适度.安全性和便利性.城市利用连接的数字设备收集的海量数据(数十亿个)来改善城市规划.制造 ...
- 海思开发板海图科技测评,海图海思开发板怎么样
关于海思开发板海图科技的测评,相关关键字:hi3516,hi3519,hi3531,hi3535,hi3536,hi3559,hi3403 最近网络上关于海图的海思开发板宣传的沸沸扬扬,很多人都想要一 ...
- 开源海思开发板(HIVIEW开发板)
大家好,今天给大家分享一个有料的海思开发板,可用于快速构建产品样机. HIVIEW简介: HIVIEW是个小而专业的设计公司(海思软/硬件设计能力13年以上) 我们的目标 **以开放的软/硬件 ...
- 海思开发板上添加ftp功能
海思开发板上添加ftp功能 前言: 本博客是基于海思3520Dv100开发,编译工具链为:arm-hisiv100nptl-linux-gcc 1.下载stupid-ftpd-1.5beta.tar. ...
- mysql移植海思_live555 交叉编译移植到海思开发板
1.首先到它的主页下载一个源码包: http://www.live555.com/liveMedia/public/ 我下载的是latest的,具体什么版本还真不清楚 2.放到linux目录下解压: ...
- vmware虚拟机中ubuntu系统里设置USB串口连接海思开发板
vmware虚拟机中ubuntu系统里设置USB串口连接海思开发板 作为海思平台的一个新手,在学习海思开发板时,会因为一个很小的问题折腾半天,但是当解决一个小问题时还是很兴奋的,记录下自己学习过程. ...
- 为什么你们说好的程序在我的海思开发板上就是不行呢,难道真的是人品有问题
就下面的程序,一个利用libpcap做的抓包程序,一个用raw socket 做的抓包程序 海思开发板 是通过映射过来的,被映射的是宝利通mcu rmx1800,终端目前用的是软终端,硬件终端还在路上 ...
- 配置海思开发板的网络(永久修改)
刚拿到的海思开发板(我的是hi3516dv300)里面默认的网络配置通常是不可用的(比如默认的网段跟我们自己的不一样.没法ping通外网等),这时候需要我们修改相关的配置文件. 1.可以先用ifcon ...
- 使用telnet来在线调试海思开发板
前言 在海思MPP软件开发时,往往会遇到一些莫名奇妙的错误或者运行结果和预想不一致(往往是参数没设对引起的).这时候就需要在程序还在运行时来在线查看调试当前的系统状态.如果按CTRL+C强行退出后再去 ...
最新文章
- linux系统下对网站实施负载均衡+高可用集群需要考虑的几点
- ITK:创建一个索引
- 有两个python怎么停用其中一_python3.X 复学(2)-----开始了就不要停止
- java中如何合并两个网格,Hazelcast: Java分布式内存网格框架(平台)
- java checkproperties(this)_【转载】java读取.properties配置文件的几种方法
- 大数据技术全解之曹冲称象与大数据思想
- 提升机器学习数学基础,这7本书一定要读-附pdf资源
- Gurobi软件求解线性规划问题(卜算学习记录)
- [项目实战篇] Emos在线办公小程序--搭建项目
- 交互式反汇编器 linux,Carbon:交互式反汇编工具
- MATLAB神经网络工具箱 BP神经网络函数化表示 BP神经网络梯度\求导函数
- 离线强化学习总结!(原理、数据集、算法、复杂性分析、超参数调优等)
- 内存管理API之get_unmapped_area
- python中quadratic_python 练习题:定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程ax^2+bx+c=0的两个解...
- 让玩家提升游戏耐玩度的8个小技巧
- 关于环境依赖问题的反思NO.1
- scala中case class与一般的class的区别
- 打脸质疑者!Mobileye市值冲高,公司CEO说出心声
- UVa1600 Patrol Robot (BFS求最短路进阶)
- 似然函数 极大似然估计 本质讲解