海思开发板FFmpeg+Nginx推流RTSP播放(优秀教程收集+实操整理)
安装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是放在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播放器百度一下即可找到下载链接
下面例图,视频来源是一个网络摄像头,它会自行推RTSP流到局域网,海思板子去对应地址抓取并转发到Nginx(RTMP),然后在linux ffplay里播放。由于是局域网,速度很快。同时开了几个去测试效果
最后感谢上面所有被我引用了文章的博主!