Centos 搭建 crtmpserver 流媒体服务器
1、安装 cmake
可以下载源码安装,https://cmake.org/ , 下面是 yum 安装
yum install -y cmake
2、安装 openssl
下载 openssl-1.0.2l
,链接: https://www.openssl.org/source/
编译安装 openssl-1.0.2l
tar -xvf openssl-1.0.2l.tar.gz
cd openssl-1.0.2l
./config --prefix=/usr/local/ssl shared
make
make install
(注意:发现使用 /usr/local/ssl 路径,后面安装 crtmpserver 才成功,要不就总提示找不到
openssl 头文件)
CentOS 升级 OpenSSL 至 OpenSSL 1.1.0f 版本<其中有遇到 libcrypto.so
一、检查当前环境
1. 查看当前版本
openssl version
或者使用
yum info openssl
2. 在升级之前检查一下 openssl 的路径
which openssl
因为需要在升级 openssl 之后,我们需要使用软链接将其链接回此路径
二、准备开始升级安装
1、下载与解压
cd ~
wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
tar -xzf openssl-1.1.0f.tar.gz
2、编译与安装
如果没有安装 gcc 可能会报错,可以直接使用 yum 安装一下 gcc
yum install gcc
cd openssl-1.1.0f
./config --prefix=/usr/local/ssl shared
make
make install
3、尝试运行/usr/local/ssl/bin/openssl version 应该会出现下面的这个错误:
/usr/local/ssl/bin/openssl: error while loading shared libraries:
libcrypto.so.1.1: cannot open shared object file: No such file or
directory
4、下面为相关的解决办法:
创建链接至 libssl
ln -s /usr/local/ssl/lib/libssl.so.1.1 /usr/lib64/
ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /usr/lib64/
5、创建链接至新的 openssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl_latest
6、检查 openssl_latest 的版本号是否是新的版本
openssl_latest version
OpenSSL 1.1.0f 25 May 2017
7、重命名旧的 openssl 文件名,并且将新的文件名改为 openssl
cd /usr/bin/
mv openssl openssl_old
mv openssl_latest openssl
openssl version
3、编译和运行 crtmpserver
下载 crtmpserver,链接:https://github.com/j0sh/crtmpserver
1 编译 crtmpserver
unzip crtmpserver-centosinit.zip
cd crtmpserver-centosinit
sh ./cleanup.sh
cd builders/cmake/
cmake .
make
如果编译成功, 接着来启动看下:
./crtmpserver/crtmpserver ./crtmpserver/crtmpserver.lua
2 使用 ffmpeg 将文件虚拟成 rtsp 流:
# ./ffmpeg -re -i rtsp_test.mp4 -vcodec copy -codec copy -f rtsp
rtsp://192.168.1.22/live/rtsp_test
音视频的编码格式只能为 H264、AAC。
发布以后可以通过 rtmp 的方式点播,流名称是从 s=No Name 获取的,即名称就
叫“No Name”,而不是 ffmpeg 命令中 rtsp URL 地址上的“mystream”。
这样就存在一个问题,不能通过 ffmpeg 向 crtmpserver 发布多路流了,因为流
的名称都为“No Name”。
从 crtmpserver 的日志可以看到 sdp 如下
(需要将 sources/thelib/include/protocols/rtp/rtspprotocol.h 中的
RTSP_DUMP_TRAFFIC 定义打开):
3 修改流名
此时 rtsp 流名称并不是 rtsp_test,查看
sources/thelib/src/protocols/rtp/basertspappprotocol.cpp,
获取 streamName 的代码如下:
解决方法:
修改 sources/thelib/src/protocols/rtp/basertspappprotocolhandler.cpp 文件的
HandleRTSPRequestAnnounce 函数,原来的代码为
string streamName = sdp.GetStreamName();
if (streamName == "") {
streamName = format("rtsp_stream_%u",
pFrom->GetId());
}
pFrom->GetCustomParameters()["sdpStreamName"] =
streamName;
即流名称是从 sdp 的 s 字段获取的。
需要改为从 url 获取,为了方便解析,可规定 url 中"?"后面的为流名称,形式为
rtsp://127.0.0.1/live?mystream。如果 url 中没有"?",会使用 ID 命名为
“rtsp_stream_ID”的形式。
代码相应改为:
vector lines;
string streamName;
split(requestHeaders[RTSP_FIRST_LINE][RTSP_URL],
"?", lines);
if (lines.size()
!= 2) {
streamName = format("rtsp_stream_%u",
pFrom->GetId());
}else {
streamName = lines[1];
}
pFrom->GetCustomParameters()["sdpStreamName"] =
streamName;